diff --git a/.clang-format b/.clang-format deleted file mode 100644 index 08e61ec8faa808972860ee2d3c23ad309ff8fbdc..0000000000000000000000000000000000000000 --- a/.clang-format +++ /dev/null @@ -1,78 +0,0 @@ ---- -Language: Cpp -BasedOnStyle: Google -AccessModifierOffset: -4 -AlignAfterOpenBracket: true -AlignEscapedNewlinesLeft: true -AlignOperands: true -AlignTrailingComments: true -AllowAllParametersOfDeclarationOnNextLine: true -AllowShortBlocksOnASingleLine: false -AllowShortCaseLabelsOnASingleLine: false -AllowShortIfStatementsOnASingleLine: false -AllowShortLoopsOnASingleLine: false -AllowShortFunctionsOnASingleLine: false -AlwaysBreakAfterDefinitionReturnType: false -AlwaysBreakTemplateDeclarations: true -AlwaysBreakBeforeMultilineStrings: true -BreakBeforeTernaryOperators: true -BinPackParameters: true -BinPackArguments: true -ColumnLimit: 120 -ConstructorInitializerAllOnOneLineOrOnePerLine: true -ConstructorInitializerIndentWidth: 4 -DerivePointerAlignment: false -PointerAlignment: Right -ExperimentalAutoDetectBinPacking: false -IndentCaseLabels: true -IndentWrappedFunctionNames: false -IndentFunctionDeclarationAfterType: false -MaxEmptyLinesToKeep: 1 -KeepEmptyLinesAtTheStartOfBlocks: false -NamespaceIndentation: None -ObjCBlockIndentWidth: 4 -ObjCSpaceAfterProperty: false -ObjCSpaceBeforeProtocolList: false -PenaltyBreakBeforeFirstCallParameter: 1 -PenaltyBreakComment: 300 -PenaltyBreakString: 1000 -PenaltyBreakFirstLessLess: 120 -PenaltyExcessCharacter: 1000000 -PenaltyReturnTypeOnItsOwnLine: 200 -Cpp11BracedListStyle: false -Standard: Auto -IndentWidth: 4 -SortIncludes: false -TabWidth: 4 -UseTab: Never -SpacesInParentheses: false -SpacesInSquareBrackets: false -SpacesInAngles: false -SpaceInEmptyParentheses: false -SpacesInCStyleCastParentheses: false -SpaceAfterCStyleCast: false -SpacesInContainerLiterals: true -SpaceBeforeAssignmentOperators: true -SpacesBeforeTrailingComments: 2 -ContinuationIndentWidth: 4 -CommentPragmas: '^ IWYU pragma:' -ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] -SpaceBeforeParens: ControlStatements -DisableFormat: false -BraceWrapping: - AfterClass: false - AfterControlStatement: false - AfterEnum: false - AfterFunction: true - AfterNamespace: false - AfterObjCDeclaration: false - AfterStruct: false - AfterUnion: false - BeforeCatch: false - BeforeElse: false - IndentBraces: false -BreakBeforeBinaryOperators: NonAssignment -BreakBeforeBraces: Custom -BreakConstructorInitializersBeforeComma: false -... - diff --git a/.gitignore b/.gitignore deleted file mode 100644 index f4b9518e49950b337566c1571f38dd049b925de4..0000000000000000000000000000000000000000 --- a/.gitignore +++ /dev/null @@ -1,80 +0,0 @@ -build/ -output -coverage_report -example/datasystem - -# for java -target - -# for python -__pycache__ - -# Editor -.vscode -.idea/ -cmake-build-debug -cmake-build-release -cmake-build-release* -venv -.cache - -# Cmake files -CMakeLists.txt.user -CMakeCache.txt -CMakeFiles -CMakeScripts -Testing -cmake_install.cmake -install_manifest.txt -compile_commands.json -CTestTestfile.cmake -_deps - -# Protobuf middleware -*.pb.* -*.pb-c.* - -# Prerequisites -*.d - -# Compiled Object files -*.slo -*.lo -*.o -*.obj -*.ko -*.elf - -# Precompiled Headers -*.gch -*.pch - -# Compiled Dynamic libraries -*.so -*.so.* -*.dylib -*.dll - -# Compiled Static libraries -*.lai -*.la -*.a -*.lib -*.lo - -# Temporary output file from clang-format -__checked_files_list__ -__code_format_check_result__ -__TEMP__* -tests/python/__pycache__/ -tests/python/nohup.out -rerun_ut.sh - -# go work -go.work - -# docs -build_zh_cn -build_en -docs/source_en/generated -false \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 3df1daea6786b014239fcb8f2ea546610c566e42..0000000000000000000000000000000000000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,155 +0,0 @@ -cmake_minimum_required(VERSION 3.14.1) - -project(Datasystem DESCRIPTION "DataSystem for Distributed Data Cache" LANGUAGES CXX C) - -# Version specified -file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" DATASYSTEM_VERSION) -add_compile_definitions(DATASYSTEM_VERSION="${DATASYSTEM_VERSION}") -message(STATUS "Datasystem version is ${DATASYSTEM_VERSION}") - -include(CMakePackageConfigHelpers) - -# Options for build. -include(cmake/options.cmake) -include(cmake/util.cmake) - -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - -# Use C++17 standard. -set(CMAKE_CXX_STANDARD 17) - -# compiler flags that are common across debug/release builds: -if (USE_SANITIZER) - # use Google sanitizers to detect memory leak and thread race. - string(TOUPPER ${USE_SANITIZER} USE_SANITIZER) - if (${USE_SANITIZER} STREQUAL "ADDRESS") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer -g3") - elseif (${USE_SANITIZER} STREQUAL "THREAD") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -g3") - elseif (${USE_SANITIZER} STREQUAL "UNDEFINED") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize=alignment -fsanitize=float-cast-overflow -fno-sanitize-recover=all -O0") - else () - message(FATAL_ERROR "Unrecognized google sanitizers mode: ${USE_SANITIZER}") - endif () -endif () -# -Wall: Enable all warnings. -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") -# -g3: Enable symbols for profiler tools. -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3") -# -Werror: Treat compile warnings as errors. -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") -# -fsigned-char: Certain platforms such as ARM do not use signed chars by default. -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsigned-char") -# -Wextra: Enables some extra warning. -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra") -# -Wfloat-equal: Warn if floating-point values are used in equality comparisons -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wfloat-equal") -# -fno-common: Specifies that the compiler places uninitialized global variables in the BSS section of the object file. -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-common") -# -rdynamic: Pass the flag -export-dynamic to the ELF linker, on targets that support it. -# This option is needed to allow obtaining backtraces from within a program. -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -rdynamic") - -# -fPIC: Position Independent Code(PIC), is only necessary when producing shared objects. -add_definitions(-fPIC) - -# debug build flags: -# -ggdb: Enable gdb debugging. -set(CMAKE_CXX_FLAGS_DEBUG "-ggdb") -# -O0: No optimize. -set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0") -# -ftrapv: Generates traps for signed overflow on addition, subtraction, multiplication operations. -set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -ftrapv") -# -fstack-check: Add stack check. -set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fstack-check") -# -DDEBUG: Add DEBUG Marco. -set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG") - -# release build flags: -# -O2: Turns on all optimization flags. -set(CMAKE_CXX_FLAGS_RELEASE "-O2") -# -fstack-protector-strong: Stack protect. -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fstack-protector-strong") -# -Wl,-z,relro: Read-Only Relocations (RELRO). -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wl,-z,relro") -# -Wl,-z,now: Bind now. -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wl,-z,now") -# -Wl,-z,noexecstack: Non-Executable Memory. -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wl,-z,noexecstack") -# -D_FORTIFY_SOURCE=2: Add checks at compile-time and run-time. -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D_FORTIFY_SOURCE=2") -# -fPIE -pie: Support address space layout randomization (ASLR). -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fPIE -pie") -# -DNDEBUG: Turn off dchecks/asserts/debug only code. -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNDEBUG") -# -Wl,--build-id=none: for build consistency. -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wl,--build-id=none") - -set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time") -set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CMAKE_COMMAND} -E time") - -find_program(CCACHE "ccache") -if (CCACHE) - message(STATUS "Use ccache to accelerate compilation") - set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE}) - set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE}) -endif () - -if (BUILD_COVERAGE) - message(STATUS "Build code with coverage mode.") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -lgcov") - add_compile_definitions(BUILD_COVERAGE) -endif () - -if (ENABLE_PERF) - add_compile_definitions(ENABLE_PERF) - message(STATUS "Enable perf point log") -endif () - -if (BUILD_HETERO) - add_compile_definitions(BUILD_HETERO) - message(STATUS "Enable hetero") -endif () - -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/module") - -set(GIT_HASH "Unknown") -set(GIT_BRANCH "Unknown") -get_git_hash(GIT_HASH) -get_git_branch(GIT_BRANCH) -message(STATUS "GIT COMMIT: ${GIT_HASH}; BRANCH: ${GIT_BRANCH}") -add_compile_options(-DGIT_HASH="${GIT_HASH}") -add_compile_options(-DGIT_BRANCH="${GIT_BRANCH}") - -# Import the third party we depends. -include(cmake/dependency.cmake) - -include_directories(include) -include_directories(src) - -# include proto pb files -include_directories(${CMAKE_BINARY_DIR}/src) - -if (WITH_TESTS) - add_compile_definitions(WITH_TESTS) -endif () - -add_subdirectory(src/datasystem) - -if (WITH_TESTS) - enable_testing() - add_subdirectory(tests) -endif () - -include(cmake/package.cmake) - -file(GLOB_RECURSE PROJECT_SOURCES "src/*.cpp" "include/*.h" "src/*.h") -foreach(SOURCE_FILE ${PROJECT_SOURCES}) - file(READ ${SOURCE_FILE} FILE_CONTENTS) - string(FIND "${FILE_CONTENTS}" "#include " FOUND_REGEX) - if (NOT ${FOUND_REGEX} EQUAL -1) - message(FATAL_ERROR "${SOURCE_FILE} include , std::regex is not avaliale, use re2 to replace") - endif() -endforeach() diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64..0000000000000000000000000000000000000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/LOG_README b/LOG_README deleted file mode 100644 index 60af0571373c4e066a319929a9fcf3c9162a8c01..0000000000000000000000000000000000000000 --- a/LOG_README +++ /dev/null @@ -1,121 +0,0 @@ -1.1.1 日志类别 -数据系统的日志分为四类: -1) 运行日志: 记录客户端、服务端运行时的日志信息,包括DEBUG、INFO、WARNING、ERROR级别; -2) 访问日志:记录每一个访问客户端/服务端请求,而且每个请求仅打印一条日志,可用于定界定位上游应用是否访问客户端/服务端; -3) 请求第三方日志:记录数据系统Worker每一个访问第三方组件日志的请求,而且每个请求仅打印一条日志,可用于定界定位数据系统是否有成功访问该外部组件; -4) 资源日志:定时输出数据系统worker运行时关键资源信息,包括共享内存使用量、Spill磁盘使用量、线程池及队列使用量等等信息。 - -数据系统Client和worker日志划分: ------------------------------------------------------------------------------------------------------------------------------ -序号 模块 日志路径及文件名 含义、用途 ------------------------------------------------------------------------------------------------------------------------------ -1 worker /path/worker/worker.INFO.log worker运行日志 -2 /path/worker/access.log 访问worker POSIX接口的日志 -3 /path/worker/resource.log Worker资源使用日志 默认关闭,通过log_monitor开关控制是否开启。 -4 /path/worker/requestout.log 访问l2cache、ETCD、AGC IAM接口日志 -5 /path/worker/container.log 容器运行日志,管理和监控worker进程的生命周期 ------------------------------------------------------------------------------------------------------------------------------ -6 Client /path/client/ds_client_.log SDK运行日志 -7 /path/client/ds_client_access_.log SDK接口访问日志 ------------------------------------------------------------------------------------------------------------------------------ - -1.1.2 日志格式 -1.1.2.1 格式介绍 ------------------------------------------------------------------------------------------------------------------------------ -序号 日志 日志格式 ------------------------------------------------------------------------------------------------------------------------------ -1 运行日志 Time | level | filename| pod_name | pid:tid | trace_id | az_name | message -2 访问日志 Time | level | filename |pod_name|pid:tid | trace_id | az_name | status_code | action | cost | data size| request param| response param -3 访问第三方日志 Time | level | filename| pod_name | pid:tid | trace_id | az_name | status_code | action | cost | data size| request param| response param -4 资源日志 Time | level | filename | pod_name | pid:tid | trace_id | az_name | 共享内存信息 | spill磁盘信息 | 客户端数 | Object总数 | Object数据总大小 | WorkerOcService线程池 | WorkerWorkerOcService线程池 | MasterWokrerOcService线程池 | MasterOcService线程池 |写l2cache队列 |写ETCD队列 | ETCD请求成功率 | OBS请求成功率 | Master异步任务线程池 | 流总数 | ClientWorkerSCService线程池 | WorkerWorkerSCService线程池 | MasterWorkerSCService线程池 | MasterSCService线程池 | 流远端推送成功率 | 共享磁盘信息 | scLocalCache信息 -5 容器运行日志 Time | level | filename| pod_name | pid:tid | trace_id | az_name | message - ------------------------------------------------------------------------------------------------------------------------------ - -1.1.2.2 日志字段 ------------------------------------------------------------------------------------------------------------------------------------------ -字段 长度 Byte 描述 ------------------------------------------------------------------------------------------------------------------------------------------ -time 26 ISO8601格式的时间戳,示例: 2023-06-02T14:58:32.081156 -level 1 日志级别 (debug, info, warn等) -filename 128 输出该条日志的函数所在文件及行号,最大长度128Byte,超出则截断。示例:oc_metadata_manager.cpp:733 -pod_name 128 输出当前worker所属的POD名称,超出长度则截断。示例:ds-worker-hs5qm -pid:tid 11 该日志所属的进程ID和线程ID。进程号最大值为32757,该字段最大长度11.示例:9:177 -traceid 36 请求的traceid。 -az_name 128 输出AZ名称,最大长度为128,超出长度则截断。示例:AZ1。 -Message 1024 自定义消息内容 -status_code 5 该请求的状态,不同消息类型状态值不一样。SDK/Worker 访问日志,0表示成功,其他表示失败。l2cache/AGC 访问日志:http请求,200表示成功,其他表示失败。 -action 64 表示该请求所访问的接口名称。约定前缀:SDK接口:DS_STATE_CLINET、DS_OBJECT_CLIENT,Worker接口:DS_OBJECT_POSIX、DS_STREAM_POSIX,ETCD:DS_ETCD,HTTP请求:POST {url path},示例:POST /v1/agc/token -cost 16 记录该请求所花费的时间。单位:us -datasize 16 记录Publish请求接收到的Payload大小。 -Request param 2560 记录该请求的关键请求参数,最大长度2048。请参考“关键请求参数”表格。 -response param 1024 记录该请求的响应信息。最大长度为1024 Byte,超出则截断。 -共享内存信息 47 记录共享内存使用信息,单位为Byte,按照1T限制大小,每个长度 13 Byte,格式为:memoryUsage/physicalMemoryUsage/totalLimit/rate/scMemoryUsage/scMemoryLimit - 1) memoryUsage 已分配的内存大小,是已缓存的对象大小总和。 - 2) physicalMemoryUsage 已分配的物理内存大小。 - 3) totalLimit 共享内存总大小。 - 4) Rate 共享内存使用率,memoryUsage/totalLimit, 保留3位有效数字,单位: %. -spill磁盘信息 47 记录Spill磁盘使用信息。单位为Byte,按照1T限制大小,每个长度 13 Byte,格式为:spaceUsage/physicalSpaceUsage/totalLimit/rate - 1) spaceUsage 已使用的磁盘大小,是已Spill的对象大小总和。 - 2) physicalSpaceUsage 已使用的物理磁盘大小。 - 3) totalLimit Spill磁盘总大小。 - 4) Rate Spill磁盘使用率,spaceUsage /totalLimit, 保留3位有效数字,单位: %. -客户端数 5 记录已和worker成功建立连接的Client数。最大值为10000. -Object总数 9 记录worker已缓存对象数。按照1亿对象限制数量。 -Object数据总大小 13 记录worker已缓存对象的大小。按照1T限制大小,长度 13 Byte -WorkerOcService线程池 21 WorkerOcService线程池使用信息,线程数限制最大128;格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate - 1) idelNum 空闲线程数; - 2) currentTotalNum 当前正在运行任务的线程数; - 3) MaxThreadNum 线程池最大可申请的线程数; - 4) waitingTaskNum 正在等待的任务数。 - 5) rate 线程利用率,currentTotalNum/ MaxThreadNum,单位:%,保留3位有效数字。 -WorkerWorkerOcService线程池 21 线程池使用信息 -MasterWokrerOcService线程池 21 线程池使用信息 -MasterOcService线程池 21 线程池使用信息 -写l2cache队列 15 队列使用信息,队列大小限制:1024,格式:currentSize/totalLimit/rate - 1) currentSize 队列已使用量 - 2) totalLimit 队列最大长度; - 3) rate 队列使用率,单位 %,保留3位有效数字。 -写ETCD队列 15 队列使用信息 -ETCD请求成功率 6 请求使用率,单位 %,保留3位有效数字 -OBS请求成功率 6 请求使用率,单位 %,保留3位有效数字 -Master异步任务线程池 21 线程池使用信息,格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate -流的个数 9 记录本节点流的个数。本节点上的流:在本节点存在producer或者consumer。 -ClientWorkerSCService线程池 21 线程池使用信息,格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate -WorkerWorkerSCService线程池 21 线程池使用信息,格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate -MasterWorkerSCService线程池 21 线程池使用信息,格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate -MasterSCService线程池 21 线程池使用信息,格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate -流远端推送成功率 6 请求使用率,单位 %,保留3位有效数字 -共享磁盘信息 47 记录共享磁盘使用信息,单位为Byte,按照1T限制大小,每个长度 13 Byte,格式为:usage/physicaleUsage/totalLimit/rate - 1) usage 已使用的磁盘大小,是已缓存的对象大小总和。 - 2) physicaleUsage 已使用的物理磁盘大小。 - 3) totalLimit 共享磁盘总大小。 - 4) rate 共享磁盘使用率,usage/totalLimit, 保留3位有效数字,单位: %. -scLocalCache信息 47 记录scLocalCache使用信息,单位为Byte,按照1T限制大小,每个长度 13 Byte,格式为:usedSize/reservedSize/totalLimit/usedRate ------------------------------------------------------------------------------------------------------------------------------------------ - -1.1.2.2.1 SDK与worker访问日志关键请求参数 ------------------------------------------------------------------------------------------------------------------------------ -关键请求参数 长度 Byte 描述 ------------------------------------------------------------------------------------------------------------------------------ -Object_key 255 对象的ID。长度:255Byte; -object_keys 1024 多个对象KEY。单个Item长度:255Byte,全部长度:1KB;超出的对象KEY,只显示出总数。示例:{“object_keys”:[”id1xx”,”id2xx”,”id3xx”,”id4xx”, total: 100]} -Nested_keys 1024 嵌套引用的对象KEY。单个Item长度:255Byte,全部长度:1KB; -keep 1 是否手动管理对象生命周期。取值:true/false, 长度:5Byte -Write_mode 1 写数据的模式,影响数据可靠性。取值:int32 -consistency_type1 数据一致性模式。取值:uint32 -is_seal 1 数据是否不可修改。取值:0/1, 0表示false -is_retry 1 是否为重试场景。取值:0/1 -ttl_second 32 TTL时间配置。取值:uint32 -sub_timeout 32 Get请求订阅时间。取值:int64 -timeout 32 接口超时时间。取值:int32 ------------------------------------------------------------------------------------------------------------------------------ - -1.1.2.2.2 访问第三方日志关键请求参数 ------------------------------------------------------------------------------------------------------------------------------ -外部组件 请求类型 关键请求参数 描述 ------------------------------------------------------------------------------------------------------------------------------ -AGC IAM HTTP HttpRequest 将HttpReques中的字段均打印出来。 -l2cache HTTP HttpRequest 将HttpReques中的字段均打印出来。 -ETCD GRPC key 将Key字段获取并打印。 ------------------------------------------------------------------------------------------------------------------------------ \ No newline at end of file diff --git a/NOTICE b/NOTICE deleted file mode 100644 index 76d9056e1682c19fc706efeb6f6f7bb27fb15809..0000000000000000000000000000000000000000 --- a/NOTICE +++ /dev/null @@ -1,2 +0,0 @@ -yuanrong-datasystem -Copyright 2025-2025 Huawei Technologies Co., Ltd diff --git a/README.md b/README.md index 76482bb60570b57b0b391de5df6f6e3eb2d02ac9..f374122ad075b25cc31a641fe4611edad3b81783 100644 --- a/README.md +++ b/README.md @@ -1,257 +1,7 @@ -![](./docs/source_zh_cn/getting-started/image/logo-large.png) +# openYuanrong datasystem -openYuanrong 是一个 Serverless 分布式计算引擎,致力于以一套统一 Serverless 架构支持 AI、大数据、微服务等各类分布式应用。它提供多语言函数编程接口,以单机编程体验简化分布式应用开发;提供分布式动态调度和数据共享等能力,实现分布式应用的高性能运行和集群的高效资源利用。 +openYuanrong datasystem 文档分支,仅用于存在渲染后的文档页面。 -## 简介 +[点击查看源码仓](https://gitee.com/openeuler/yuanrong-datasystem/tree/master) -![](./docs/source_zh_cn/getting-started/image/introduction.png) - -openYuanrong 由多语言函数运行时、函数系统和数据系统组成,支持按需灵活单独或组合使用。 - -- **多语言函数运行时**:提供函数分布式编程,支持 Python、Java、C++ 语言,实现类单机编程高性能分布式运行。 -- **函数系统**:提供大规模分布式动态调度,支持函数实例极速弹性扩缩和跨节点迁移,实现集群资源高效利用。 -- **数据系统**:提供异构分布式多级缓存,支持 Object、Stream 语义,实现函数实例间高性能数据共享及传递。 - -openYuanrong 分为三个代码仓库:[yuanrong-runtime](https://gitee.com/openeuler/yuanrong-runtime) 对应多语言函数运行时;[yuanrong-functionsystem](https://gitee.com/openeuler/yuanrong-functionsystem) 对应函数系统;[yuanrong-datasystem](https://gitee.com/openeuler/yuanrong-datasystem) 对应数据系统,即当前代码仓。 - -**数据系统(openYuanrong datasystem)** 是 openYuanrong 的核心概念抽象,是一个分布式缓存系统,利用计算集群的 HBM/DRAM/SSD 资源构建近计算多级缓存,提升模型训练及推理、大数据、微服务等场景数据访问性能。 - -openYuanrong datasystem 的主要特性包括: - -- **高性能分布式多级缓存**:基于 DRAM/SSD 构建分布式多级缓存,应用实例通过共享内存免拷贝读写 DRAM 数据,并提供高性能 H2D(host to device)/D2H(device to host) 接口,实现 HBM 与 DRAM 之间快速 swap。 -- **NPU 间高效数据传输**:将 NPU 的 HBM 抽象为异构对象,自动协调 NPU 间 HCCL 收发顺序,实现简单易用的卡间数据异步并发传输。并支持P2P传输负载均衡策略,充分利用卡间链路带宽。 -- **灵活的生命周期管理**:支持设置 TTL、LRU 缓存淘汰以及 delete 接口等多种生命周期管理策略,数据生命周期既可由数据系统管理,也可交由上层应用管理,提供更高的灵活性。 -- **热点数据多副本**:数据跨节点读取时自动在本地保存副本,支撑热点数据高效访问。本地副本使用 LRU 策略自动淘汰。 -- **多种数据可靠性策略**:支持 write_through、wirte_back 及 none 多种持久化策略,满足不同场景的数据可靠性需求。 -- **数据一致性**:支持 Causal 及 PRAM 两种数据一致性模型,用户可按需选择,实现性能和数据一致性的平衡。 -- **数据发布订阅**:支持数据订阅发布,解耦数据的生产者(发布者)和消费者(订阅者),实现数据的异步传输与共享。 -- **高可靠高可用**:支持分布式元数据管理,实现系统水平线性扩展。支持元数据可靠性,支持动态资源伸缩自动迁移数据,实现系统高可用。 - -### openYuanrong datasystem 适用场景 - -- **LLM 长序列推理 KVCache**:基于异构对象提供分布式多级缓存 (HBM/DRAM/SSD) 和高吞吐 D2D/H2D/D2H 访问能力,构建分布式 KV Cache,实现 Prefill 阶段的 KVCache 缓存以及 Prefill/Decode 实例间 KV Cache 快速传递,提升推理吞吐。 -- **模型推理实例 M->N 快速弹性**:利用异构对象的卡间直通及 P2P 数据分发能力实现模型参数快速复制。 -- **强化学习模型参数重排**:利用异构对象的卡间直通传输能力,快速将模型参数从训练侧同步到推理侧。 -- **训练场景 CheckPoint 快速保存及加载**:基于 KV 接口快速写 Checkpoint,并支持将数据持久化到二级缓存保证数据可靠性。Checkpoint恢复时各节点将 Checkpoint 分片快速加载到异构对象中,利用异构对象的卡间直通传输及 P2P 数据分发能力,快速将 Checkpoint 传递到各节点 HBM。 -- **微服务状态数据快速读写**:基于 KV 接口实现内存级读写微服务状态数据,并支持将数据持久化到二级缓存保证数据可靠性。 - -### openYuanrong datasystem 架构 - -![](./docs/source_zh_cn/getting-started/image/logical_architecture.png) - -openYuanrong datasystem 由三个部分组成: - -- **多语言SDK**:提供 Python/C++ 语言接口,封装 heterogeneous object 及 KV 接口,支撑业务实现数据快速读写。提供两种类型接口: - - **heterogeneous object**:基于 NPU 卡的 HBM 内存抽象异构对象接口,实现昇腾 NPU 卡间数据高速直通传输。同时提供 H2D/D2H 高速迁移接口,实现数据快速在 DRAM/HBM 之间传输。 - - **KV**:基于共享内存实现免拷贝的 KV 接口,实现高性能数据缓存,支持通过对接外部组件提供数据可靠性语义。 - -- **worker**:openYuanrong datasystem 的核心组件,用于分配管理 DRAM/SSD 资源以及元数据,提供分布式多级缓存能力。 - -- **集群管理**:依赖 ETCD,实现节点发现/健康检测,支持故障恢复及在线扩缩容。 - -![](./docs/source_zh_cn/getting-started/image/deployment.png) - -openYuanrong datasystem 的部署视图如上图所示: - -- 需部署 ETCD 用于集群管理。 -- 每个节点需部署 worker 进程并注册到 ETCD。 -- SDK 集成到用户进程中并与同节点的 worker 通信。 - -各组件间的数据传输协议如下: - -- SDK 与 worker 之间通过共享内存读写数据。 -- worker 和 worker 之间通过 TCP/RDMA 传输数据(当前版本仅支持 TCP,RDMA/UB 即将支持)。 -- 异构对象 HBM 之间通过 HCCS/RoCE 卡间直通传输数据。 - -## 入门 - -### 安装 openYuanrong datasystem - -#### pip 方式安装 - -- 安装 openYuanrong datasystem 完整发行版(包含Python SDK、C++ SDK以及命令行工具): - ```bash - pip install https://openyuanrong.obs.cn-southwest-2.myhuaweicloud.com/openyuanrong_datasystem-0.5.0-cp39-cp39-manylinux_2_34_x86_64.whl - ``` - -- 仅安装 openYuanrong datasystem Python SDK(不包含C++ SDK以及命令行工具): - ```bash - pip install https://openyuanrong.obs.cn-southwest-2.myhuaweicloud.com/openyuanrong_datasystem_sdk-0.5.0-cp39-cp39-manylinux_2_34_x86_64.whl - ``` - -#### 源码编译方式安装 - -使用源码编译方式安装 openYuanrong datasystem 可以参考文档:[源码编译安装 openYuanrong datasystem](./docs/source_zh_cn/getting-started/install.md#源码编译安装) - -### 部署 openYuanrong datasystem - -#### 进程部署 - -- 准备ETCD - - openYuanrong datasystem 的集群管理依赖 ETCD,请先在后台启动单节点 ETCD(示例端口 2379): - ```bash - etcd --listen-client-urls http://0.0.0.0:2379 \ - --advertise-client-urls http://localhost:2379 & - ``` -- 一键部署 - - 安装 openYuanrong datasystem 完整发行版后,即可通过随包自带的 dscli 命令行工具一键完成集群部署。在当前启动一个监听端口号为 31501 的服务端进程: - ```bash - dscli start -w --worker_address "127.0.0.1:31501" --etcd_address "127.0.0.1:2379" - ``` - -- 一键卸载 - ```bash - dscli stop --worker_address "127.0.0.1:31501" - ``` - -更多进程部署参数与部署方式请参考文档:[openYuanrong datasystem 进程部署](./docs/source_zh_cn/getting-started/deploy.md#openyuanrong-datasystem进程部署) - -#### Kubernetes 部署 - -openYuanrong datasystem 还提供了基于 Kubernetes 容器化部署方式,部署前请确保部署环境集群已就绪 Kubernetes、Helm 及可访问的 ETCD 集群。 - -- 获取 openYuanrong datasystem helm chart 包 - - 安装 openYuanrong datasystem 完整发行版后,即可通过随包自带的 dscli 命令行工具在当前路径下快速获取 helm chart 包: - ``` - dscli generate_helm_chart -o ./ - ``` - -- 编辑集群部署配置 - - openYuanrong datasystem 通过 ./datasystem/values.yaml 文件进行集群相关配置,其中必配项如下: - - ```yaml - global: - # 其他配置项... - - # 镜像仓地址 - imageRegistry: "swr.cn-south-1.myhuaweicloud.com/openeuler/" - # 镜像名字和镜像tag - images: - datasystem: "openYuanrong-datasystem:0.5.0" - - etcd: - # ETCD集群地址 - etcdAddress: "127.0.0.1:2379" - ``` - -- 集群部署 - - Helm 会提交 DaemonSet,按节点依次拉起 openYuanrong datasystem 实例: - - ```bash - helm install openyuanrong_datasystem ./datasystem - ``` - -- 集群卸载 - - ```bash - helm uninstall openyuanrong_datasystem - ``` - -更多 openYuanrong datasystem Kubernetes 高级参数配置请参考文档:[openYuanrong datasystem Kubernetes 部署](./docs/source_zh_cn/getting-started/deploy.md#openyuanrong-datasystem-kubernetes部署) - -### 代码样例 - -- 异构对象 - - 通过异构对象接口,将任意二进制数据以键值对形式写入 HBM: - - ```python - import acl - import os - from datasystem import Blob, DsClient, DeviceBlobList - - # hetero_dev_mset and hetero_dev_mget must be executed in different processes - # because they need to be bound to different NPUs. - def hetero_dev_mset(): - client = DsClient("127.0.0.1", 31501) - client.init() - - acl.init() - device_idx = 1 - acl.rt.set_device(device_idx) - - key_list = [ 'key1', 'key2', 'key3' ] - data_size = 1024 * 1024 - test_value = "value" - - in_data_blob_list = [] - for _ in key_list: - tmp_batch_list = [] - for _ in range(4): - dev_ptr, _ = acl.rt.malloc(data_size, 0) - acl.rt.memcpy(dev_ptr, data_size, acl.util.bytes_to_ptr(test_value.encode()), data_size, 1) - blob = Blob(dev_ptr, data_size) - tmp_batch_list.append(blob) - blob_list = DeviceBlobList(device_idx, tmp_batch_list) - in_data_blob_list.append(blob_list) - client.hetero().dev_mset(key_list, in_data_blob_list) - - def hetero_dev_mget(): - client = DsClient("127.0.0.1", 31501) - client.init() - - acl.init() - device_idx = 2 - acl.rt.set_device(device_idx) - - key_list = [ 'key1', 'key2', 'key3' ] - data_size = 1024 * 1024 - out_data_blob_list = [] - for _ in key_list: - tmp_batch_list = [] - for _ in range(4): - dev_ptr, _ = acl.rt.malloc(data_size, 0) - blob = Blob(dev_ptr, data_size) - tmp_batch_list.append(blob) - blob_list = DeviceBlobList(device_idx, tmp_batch_list) - out_data_blob_list.append(blob_list) - client.hetero().dev_mget(key_list, out_data_blob_list, 60000) - client.hetero().dev_delete(key_list) - - pid = os.fork() - if pid == 0: - hetero_dev_mset() - os._exit(0) - else: - hetero_dev_mget() - os.wait() - ``` - -- KV - - 通过 KV 接口,将任意二进制数据以键值对形式写入 DDR: - - ```python - from datasystem.ds_client import DsClient - - client = DsClient("127.0.0.1", 31501) - client.init() - - key = "key" - expected_val = b"value" - client.kv().set(key, expected_val) - - val = client.kv().get([key]) - assert val[0] == expected_val - - client.kv().delete([key]) - ``` - -## 文档 - -有关 openYuanrong datasystem 安装指南、教程和 API 的更多详细信息,请参阅 [用户文档](docs)。 - -有关 openYuanrong 更多详细信息请参阅 [openYuanrong 文档](https://pages.openeuler.openatom.cn/openyuanrong/docs/zh-cn/latest/index.html),了解如何使用 openYuanrong 开发分布式应用。 - -## 贡献 - -我们欢迎您对 openYuanrong 做各种形式的贡献,请参阅我们的[贡献者指南](https://pages.openeuler.openatom.cn/openyuanrong/docs/zh-cn/latest/contributor_guide/index.html)。 - -## 许可证 - -[Apache License 2.0](LICENSE) \ No newline at end of file +[点击查看官方文档](https://pages.openeuler.openatom.cn/openyuanrong-datasystem/docs/zh-cn/latest/index.html) \ No newline at end of file diff --git a/Third_Party_Open_Source_Software_Notice b/Third_Party_Open_Source_Software_Notice deleted file mode 100644 index 00cf6eff08b62855bbb536d7e6d136add4801743..0000000000000000000000000000000000000000 --- a/Third_Party_Open_Source_Software_Notice +++ /dev/null @@ -1,4618 +0,0 @@ -OPEN SOURCE SOFTWARE NOTICE - -Please note we provide an open source software notice along with this product and/or this product firmware (in the following just “this product”). The open source software licenses are granted by the respective right holders. And the open source licenses prevail all other license information with regard to the respective open source software contained in the product, including but not limited to End User Software Licensing Agreement. This notice is provided on behalf of Huawei Technologies Co. Ltd. and any of its local subsidiaries which may have provided this product to you in your local country. - -Warranty Disclaimer -THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS. - -Copyright Notice and License Texts - -Software: nlohmann/json 3.11.3 -Copyright notice: -Copyright (c) 2013-2019 Niels Lohmann . -Copyright Louis Dionne 2015 -Copyright (c) 2013-2019 Niels Lohmann -Copyright 2013-2019 [Niels Lohmann](http:nlohmann.me) -Copyright (c) 2016 Nicolas Seriot -Copyright (c) 2013-2019 Niels Lohmann . -Copyright (c) 2018 Vitaliy Manushkin . -Copyright (c) 2015 Max Woolf -Copyright (c) 2018-2019 Bryan Gillespie -Copyright (c) 2015-2017 Niels Lohmann. -Copyright (c) 2015-2017 Niels Lohmann -Copyright (c) 2016-2019 Viktor Kirilov -Copyright (c) 2016-2018 Viktor Kirilov -Copyright 2014 The Authors -Copyright (c) 2009 Google Inc. All rights reserved. -Copyright (C) 2009 Google Inc. -Copyright (c) 2012, Erik Edlund -Copyright 2015 Google Inc. All rights reserved. -Copyright 2018 Google Inc. All rights reserved. -Copyright 2016 Ismael Jimenez Martinez. All rights reserved. -Copyright 2017 Roman Lebedev. All rights reserved. - -License: MIT License -The MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -Software: google/protobuf 3.13.0 -Copyright notice: -Copyright 2008 Google Inc. All rights reserved. -Copyright 2007 Google Inc. All Rights Reserved. -Copyright 2008 Google Inc. -Copyright 2017 Google Inc. All rights reserved. -Copyright 2014 Google Inc. All rights reserved. -Copyright 2009 Google Inc. All rights reserved. -Copyright 2019 Google Inc. All rights reserved. -Copyright 2016 Google Inc. All rights reserved. -Copyright 2015 Google Inc. All rights reserved. -Copyright (c) 2006, Google Inc. -Copyright 2012 Google Inc. All rights reserved. -Copyright 2008 Google Inc. All Rights Reserved. -Copyright 2005 Google Inc. -Copyright 2018 Google Inc. All rights reserved. - -License: BSD 3-Clause License -Copyright 2008 Google Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Code generated by the Protocol Buffer compiler is owned by the owner -of the input file used when generating it. This code is not -standalone and requires a support library to be linked with it. This -support library is itself covered by the above license. - -Software: RocksDB 7.10.2 -Copyright notice: -Copyright (c) 1989, 1991 Free Software Foundation, Inc. -copyrighted by the Free Software Foundation -Copyright (c) 2011 The LevelDB Authors -Copyright (c) Facebook, Inc. and its affiliates -Copyright (c) 2011-present, Facebook, Inc. -Copyright (c) 2007,2008,2009,2010,2011,2012,2013,2014 Ole Tange and Free Software Foundation, Inc. -Copyright (c) 2007,2008,2009,2010,2011,2012,2013,2014 Ole Tange and Free Software Foundation -Copyright (c) 2013-present, Facebook, Inc. -Copyright (c) Meta Platforms, Inc. and affiliates -Copyright (c) 2020-present, Facebook, Inc. -Copyright (c) 2018-present, Facebook, Inc. -Copyright (c) 2016-present, Facebook, Inc. -Copyright (c) 2022-present, Facebook, Inc. -Copyright 2014 The LevelDB Authors -Copyright (c) 2021-present, Facebook, Inc. -Copyright (c) 2022 Meta Platforms, Inc. -Copyright (c) 2019-present, Facebook, Inc. -Copyright (c) 2022, Meta Platforms, Inc. and affiliates -Copyright (c) 2013 The LevelDB Authors -Copyright (c) 2012 The LevelDB Authors -Copyright (c) 2014 The LevelDB Authors -Copyright (c) 2013, Facebook, Inc. -Copyright (c) 2021, Facebook, Inc. -Copyright (c) 2017-present, Facebook, Inc. -Copyright (c) 2015, Red Hat, Inc. -Copyright (c) 2016, Facebook, Inc. -Copyright (c) 2011 the original author or authors -Copyright (c) 2014, Vlad Balan (vlad.gm@gmail.com) -Copyright (c) 2015, Facebook, Inc. -Copyright (c) 2014, Facebook, Inc. -Copyright (c) 2019 Intel Corporation -(c) CompressionOptions options CompressionInfo -Copyright (c) 2002-2020 Free Software Foundation, Inc. -Copyright 2008, Google Inc. -Copyright 2005, Google Inc. -Copyright 2007, Google Inc. -Copyright 2008 Google Inc. -Copyright 2015, Google Inc. -Copyright 2009 Google Inc. -Copyright 2003 Google Inc. -Copyright 2006, Google Inc. -(c) 2004-present, Facebook Inc. -(c) 2004-present, Facebook -Copyright 2016 Ferry Toth, Exalon Delft BV -Copyright (c) 2018, Arm Limited and affiliates -Copyright (c) 2017 International Business Machines Corp. -Copyright (c) 2015 Anton Blanchard , IBM -Copyright (c) 2015, 2017 International Business Machines Corp. -Portions Copyright (c) 2011-present, Facebook, Inc. -Copyright (c) 2012-2020 Yann Collet -Copyright (c) 2012-2021 Yann Collet -Copyright (c) 2012-2016, Yann Collet -Copyright (c) 2019-present, Yann Collet -Copyright (c) 2012 Facebook -Copyright 2013 Facebook -Copyright 2013 Facebook, Inc. -Copyright (c) 2007 Free Software Foundation, Inc. -Copyright (c) 2006, 2015, Percona and/or its affiliates - -License: Apache License V2.0 - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -Software: snappy 1.1.8 -Copyright notice: -Copyright 2019 Google Inc. All Rights Reserved. -Copyright 2013 Steinar H. Gunderson, and is licensed under the Creative Commons Attribution 3.0 license CC-BY-3.0). -Copyright 2011 Martin Gieseking <martin.gieseking@uos.de>. -Copyright 2011 Google Inc. All Rights Reserved. -Copyright 2008 Google Inc. All Rights Reserved. -Copyright 2005 and onwards Google Inc. -Copyright 2005 Google Inc. All Rights Reserved. - -License: BSD 3-Clause License -Please see above - -Software: libzmq v4.3.5 -Copyright notice: -Copyright (c) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. -Copyright (c) 1995, 1996, 1997, and 1998 WIDE Project. All rights reserved -Copyright (c) 2012 Zack Weinberg -Copyright (c) 2007-2016 Contributors -Copyright (c) 2011-2012 TheClashingRocks.org -Copyright (c) 2013 Ericsson AB -Copyright (c) 2015-2016 Brocade Communications Systems Inc. -Copyright (c) 2014 Kevin Cernekee -Copyright (c) 2011 VMware, Inc. -Copyright 2014- , Laszlo Boszormenyi (GCS) 2012-2014, Alessandro Ghedini 2010-2012, Martin Lucina 2009-2010, Adrian von Bidder 2009-2010, Peter Busser 2012, Alessandro Ghedini -Copyright (c) 2015 Bastien ROUCARIES -Copyright (c) 2012 Spotify AB -Copyright (c) 2015 Google, Inc. -Copyright (c) 2013 Roy Stogner -Copyright (c) 2010-2011 Miru Limited -Copyright (c) 2012 Xan Lopez -Copyright (c) 2012 Dan Winship -Copyright (c) 2008 Scott Pakin -Copyright 2009-2011, 250bpm s.r.o 2007-2013, iMatix Corporation 2010-2011, Miru Limited 2011, VMware, Inc 2007-2023, Other -Copyright (c) 2011 Maarten Bosmans -Copyright (c) 2015 Moritz Klammler -Copyright (c) 2012 Christian Persch -Copyright (c) 2008 Benjamin Kosnik -Copyright (c) 2012 The ZeroMQ Authors -Copyright (c) 2014, 2015 Google Inc. -Copyright (c) 2014, Joe Eli McIlvain All rights reserved -Copyright (c) 2012, 2016 Philip Withnall -Copyright (c) 2007-2014 iMatix Corporation -Copyright 2012-2020, Bert Belder All rights reserved -Copyright (c) 2012 Paolo Borelli -Copyright (c) 2015 Paul Norman -Copyright (c) 2008 Guido U. Draheim -Copyright (c) 2014 AppDynamics Inc. -Copyright 2012 iMatix Corporation and Contributors -Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams -Copyright (c) 2009-2011 250bpm s.r.o. -Copyright 2007-2014 Mike Karlesky 2007-2014 Mark VanderVoord 2007-2014 Greg Williams -Copyright (c) 2014, 2015, 2016 Philip Withnall - -License: Mozilla Public License (MPL) V2.0 -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. - -Software: libsodium 1.0.18 -Copyright notice: -Copyright (c) 1996-2018 Free Software Foundation, Inc. -Copyright (c) 2002-2018 Free Software Foundation, Inc. -Copyright (c) 2001-2018 Free Software Foundation, Inc. -Copyright (c) 1997-2018 Free Software Foundation, Inc. -Copyright (c) 1999-2018 Free Software Foundation, Inc. -Copyright (c) 2003-2018 Free Software Foundation, Inc. -Copyright (c) 2009-2018 Free Software Foundation, Inc. -Copyright (c) 2006-2018 Free Software Foundation, Inc. -Copyright (c) 2004-2018 Free Software Foundation, Inc. -Copyright (c) 1992-1996, 1998-2012 Free Software Foundation, Inc. -Copyright (c) 2012 Free Software Foundation, Inc. -Copyright (c) 2014 Free Software Foundation, Inc. -Copyright (c) 2013-2019 Frank Denis -Copyright (c) 1994-2018 Free Software Foundation, Inc. -Copyright 1992-2019 Free Software Foundation, Inc. -Copyright (c) 1994 X Consortium -Copyright (c) 1996-2015 Free Software Foundation, Inc. -Copyright (c) 2004-2015 Free Software Foundation, Inc. -Copyright (c) 2010-2015 Free Software Foundation, Inc. -Copyright (c) 2011-2018 Free Software Foundation, Inc. -Copyright (c) 2013-2019 The libsodium authors -Copyright (c) 2008 Guido U. Draheim -Copyright (c) 2011 Maarten Bosmans -Copyright (c) 2008 John Darrington -Copyright (c) 2015 Enrico M. Crisostomo -Copyright (c) 2008 Steven G. Johnson -Copyright (c) 2011 Daniel Richard G. -Copyright (c) 2008 Alan Woodland -Copyright (c) 2010 Diego Elio Petteno -Copyright (c) 2014, 2015, 2016 Philip Withnall -Copyright (c) 2008-2013 Free Software Foundation, Inc. -Copyright (c) 1996-2001, 2003-2015 Free Software Foundation, Inc. -Copyright (c) 2011 Free Software Foundation, Inc. -Copyright (c) 2004-2005, 2007-2009, 2011-2015 Free Software Foundation, Inc. -Copyright (c) 2004-2005, 2007-2008, 2011-2015 Free Software Foundation, Inc. -Copyright (c) 2004, 2011-2015 Free Software Foundation, Inc. -Copyright (c) 2004-2005, 2007, 2009, 2011-2015 Free Software Foundation, Inc. -(c) 2013-2019 Frank Denis -Copyright 2005,2007,2009 Colin Percival -Copyright (c) 2015 Thomas Pornin -Copyright 2013 Alexander Peslyak -Copyright 2009 Colin Percival -Copyright 2012,2013 Alexander Peslyak - -License: Apache License V2.0 -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and -You must cause any modified files to carry prominent notices stating that You changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. -You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -Software: jemalloc 5.3.0 -Copyright notice: -Copyright (c) 2012 Zack Weinberg -Copyright 1998-2007 Google Inc. -Copyright (c) 2015 Moritz Klammler -Copyright (c) 2008 Benjamin Kosnik -Copyright (c) 2006-2008 Alexander Chemeris -Copyright (c) 2014, 2015 Google Inc. -Copyright (c) 2009-present Facebook, Inc. -Copyright (c) 1998-2007, Google Inc. -Copyright (c) 2013 Roy Stogner -Copyright (c) 2015 Paul Norman -Copyright 1992-2021 Free Software Foundation, Inc. -Copyright (c) 2016, 2018 Krzesimir Nowak -Copyright (c) 2019 Enji Cooper -Copyright (c) 2002-present Jason Evans -Copyright 1991 by the Massachusetts Institute of Technology -Copyright (c) 2006, 2007 Mutsuo Saito, Makoto Matsumoto and Hiroshima University -Copyright 2009-2010 Andrea Leofreddi -Copyright (c) 2006,2007 Mutsuo Saito, Makoto Matsumoto and Hiroshima University -Copyright (c) 2010-2012 Austin Appleby -Copyright (c) 2007 Mutsuo Saito, Makoto Matsumoto and Hiroshima University -Copyright (c) 2007-2012 Mozilla Foundation - - -License: BSD 2-Clause License -BSD Two Clause License -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -1.Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -2.Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Software: pybind11 2.10.3 -Copyright notice: -Copyright (c) 2006, 2007 Montel Laurent, -Copyright (c) 2008, 2009 Gael Guennebaud, -Copyright (c) 2009 Benoit Jacob -Copyright (c) 2015 Wenzel Jakob -Copyright (c) 2016 Ben North -Copyright (c) 2016 Ivan Smirnov -Copyright (c) 2016 Ivan Smirnov -Copyright (c) 2016 Jason Rhinelander -Copyright (c) 2016 Klemens D. Morgenstern -Copyright (c) 2016 Klemens Morgenstern and Wenzel Jakob -Copyright (c) 2016 Pim Schellart -Copyright (c) 2016 Sergey Lyskov -Copyright (c) 2016 Sergey Lyskov and Wenzel Jakob -Copyright (c) 2016 Trent Houliston and Wenzel Jakob -Copyright (c) 2016 Wenzel Jakob -Copyright (c) 2016 Wenzel Jakob , -Copyright (c) 2017 Borja Zarco (Google LLC) -Copyright (c) 2017 Henry F. Schreiner -Copyright (c) 2017 Jason Rhinelander -Copyright (c) 2017 Wenzel Jakob -Copyright (c) 2018 Hudson River Trading LLC -Copyright (c) 2019 Google Inc. -Copyright (c) 2019 Google LLC -Copyright (c) 2019 Roland Dreier -Copyright (c) 2020 Wenzel Jakob -Copyright (c) 2020 Wenzel Jakob and Henry Schreiner -Copyright (c) 2021 Laramie Leavitt (Google LLC) -Copyright (c) 2021 The Pybind Development Team. -Copyright (c) 2022 Google LLC -Copyright (c) Google LLC -Copyright 2001-2009 Kitware, Inc. -Copyright 2012 Continuum Analytics, Inc. -Copyright 2020 Jan Tojnar - -License: BSD 3-Clause License -Please see above - -Software: tbb 2020.3 -Copyright notice: -Copyright (c) 2005-2020 Intel Corporation -Copyright (c) 2011, Google Inc. -Copyright (c) 2005-2016 Lode Vandevenne -Copyright (c) 2016-2020 Intel Corporation -Copyright (c) 2017-2020 Intel Corporation -Copyright (c) 2019-2020 Intel Corporation -Copyright (c) 2018-2020 Intel Corporation -Copyright (c) 2020 Intel Corporation -Copyright (c) 2008,2016 david decotigny (Pool of threads) -Copyright (c) 2006-2008, R Oudkerk (multiprocessing.Pool) -Copyright (c) 1994-2008 John E. Stone -Copyright (C) 1996-2010 Julian Seward -copyright (C) 1996-2010 Julian R Seward. All -Copyright (c) 1996-2010 Julian R Seward. -Copyright © 2005-2020 Intel Corporation. All Rights Reserved. - -License: Apache License V2.0 -Please see above - -Software: openssl 1.1.1k -Copyright notice: -Copyright 1998-2020 The OpenSSL Project Authors -Copyright 2016-2018 The OpenSSL Project Authors -Copyright 2016-2021 The OpenSSL Project Authors -Copyright 1995-2020 The OpenSSL Project Authors -Copyright (c) 1998-2019 The OpenSSL Project -Copyright (c) 1995-1998 Eric Young (eay@cryptsoft.com) -Copyright (c) 1998-2021 The OpenSSL Project -Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson -Copyright 1995-2018 The OpenSSL Project Authors -Copyright 1995-2019 The OpenSSL Project Authors -Copyright 2018 The OpenSSL Project Authors -Copyright 1995-2021 The OpenSSL Project Authors -Copyright 2000-2018 The OpenSSL Project Authors -Copyright 2008-2020 The OpenSSL Project Authors -Copyright 2002-2020 The OpenSSL Project Authors -Copyright (c) 2002, Oracle and/or its affiliates -Copyright 2000-2020 The OpenSSL Project Authors -Copyright 2006-2020 The OpenSSL Project Authors -Copyright 1999-2018 The OpenSSL Project Authors -Copyright 2001-2020 The OpenSSL Project Authors -Copyright 2015-2018 The OpenSSL Project Authors -Copyright 1999-2020 The OpenSSL Project Authors -Copyright 2006-2018 The OpenSSL Project Authors -Copyright 2004-2018 The OpenSSL Project Authors -Copyright 1998-2018 The OpenSSL Project Authors -Copyright 2015-2020 The OpenSSL Project Authors -Copyright (c) 2013-2014 Timo Teras -Copyright 2005 Nokia -Copyright 2004-2020 The OpenSSL Project Authors -Copyright (c) 2004, EdelKey Project -Copyright 2016-2019 The OpenSSL Project Authors -Copyright 1998-2017 The OpenSSL Project Authors -Copyright 1995-2016 The OpenSSL Project Authors -Copyright 1999-2016 The OpenSSL Project Authors -Copyright 2002-2018 The OpenSSL Project Authors -Copyright (c) 2002 The OpenTSA Project -Copyright 2010-2016 The OpenSSL Project Authors -Copyright 2016 The OpenSSL Project Authors -Copyright 2016 VMS Software, Inc. -Copyright 2010-2020 The OpenSSL Project Authors -Copyright 2011-2018 The OpenSSL Project Authors -Copyright 2011-2021 The OpenSSL Project Authors -Copyright 2012-2020 The OpenSSL Project Authors -Copyright 1998-2019 The OpenSSL Project Authors -Copyright 2017-2019 The OpenSSL Project Authors -Copyright 2000-2016 The OpenSSL Project Authors -Copyright 2004-2017 The OpenSSL Project Authors -Copyright 2004-2016 The OpenSSL Project Authors -Copyright (c) 2004, Richard Levitte -Copyright (c) 2004, 2018, Richard Levitte -Copyright 2002-2016 The OpenSSL Project Authors -Copyright 2004-2014, Akamai Technologies -Copyright 2011-2019 The OpenSSL Project Authors -Copyright 2011-2016 The OpenSSL Project Authors -Copyright 2003-2020 The OpenSSL Project Authors -Copyright 2001-2021 The OpenSSL Project Authors -Copyright 2009-2020 The OpenSSL Project Authors -Copyright 2014-2019 The OpenSSL Project Authors -Copyright 2009-2021 The OpenSSL Project Authors -Copyright 2007-2020 The OpenSSL Project Authors -Copyright 2017-2018 The OpenSSL Project Authors -Copyright 2010-2019 The OpenSSL Project Authors -Copyright 2012-2016 The OpenSSL Project Authors -Copyright 2005-2016 The OpenSSL Project Authors -Copyright 2005-2020 The OpenSSL Project Authors -Copyright 2016-2020 The OpenSSL Project Authors -Copyright 2001-2019 The OpenSSL Project Authors -Copyright 2008-2016 The OpenSSL Project Authors -Copyright 2006-2016 The OpenSSL Project Authors -Copyright 2013-2020 The OpenSSL Project Authors -Copyright 2011-2020 The OpenSSL Project Authors -Copyright 2014-2020 The OpenSSL Project Authors -Copyright 2017 The OpenSSL Project Authors -Copyright (c) 2017, Oracle and/or its affiliates -Copyright (c) 2017 National Security Research Institute -Copyright 1995-2017 The OpenSSL Project Authors -Copyright 1999-2017 The OpenSSL Project Authors -Copyright 1999-2019 The OpenSSL Project Authors -Copyright 2005-2017 The OpenSSL Project Authors -Copyright 2012-2017 The OpenSSL Project Authors -Copyright 2008-2021 The OpenSSL Project Authors -Copyright 2000-2021 The OpenSSL Project Authors -Copyright 2000-2019 The OpenSSL Project Authors -Copyright 2000-2017 The OpenSSL Project Authors -Copyright 2015-2016 The OpenSSL Project Authors -Copyright Patrick Powell 1995 -Copyright 2005-2019 The OpenSSL Project Authors -Copyright 2016-2017 The OpenSSL Project Authors -Copyright 2012, Samuel Neves -Copyright 2002-2019 The OpenSSL Project Authors -Copyright 2014-2017 The OpenSSL Project Authors -Copyright 2014-2018 The OpenSSL Project Authors -Copyright 1998-2021 The OpenSSL Project Authors -Copyright 2013-2016 The OpenSSL Project Authors -Copyright (c) 2012, Intel Corporation -Copyright 2013-2018 The OpenSSL Project Authors -Copyright 2007-2016 The OpenSSL Project Authors -Copyright 2006 NTT (Nippon Telegraph and Telephone Corporation) -Copyright (c) 2008 Andy Polyakov -Copyright 2008-2019 The OpenSSL Project Authors -Copyright 2008-2018 The OpenSSL Project Authors -Copyright 2013-2019 The OpenSSL Project Authors -Copyright 2009-2018 The OpenSSL Project Authors -Copyright 1998-2016 The OpenSSL Project Authors -Copyright 2015-2019 The OpenSSL Project Authors -Copyright 2006-2019 The OpenSSL Project Authors -Copyright 2001-2018 The OpenSSL Project Authors -Copyright 2011 Google Inc. -Copyright (c) 2014, Intel Corporation -Copyright (c) 2015, CloudFlare, Inc. -Copyright 2014-2016 The OpenSSL Project Authors -Copyright (c) 2015 CloudFlare, Inc. -Copyright 2018-2020 The OpenSSL Project Authors -Copyright 2015-2016 Cryptography Research, Inc. -Copyright 2015 Cryptography Research, Inc. -Copyright 2017-2020 The OpenSSL Project Authors -Copyright 2014 Cryptography Research, Inc. -Copyright 2016 Cryptography Research, Inc. -Copyright 2014-2016 Cryptography Research, Inc. -Copyright 2001-2016 The OpenSSL Project Authors -Copyright 2017-2021 The OpenSSL Project Authors -Copyright 2001-2017 The OpenSSL Project Authors -Copyright 1999-2021 The OpenSSL Project Authors -Copyright 2017 Ribose Inc. -Copyright 2007-2018 The OpenSSL Project Authors -Copyright 2010-2021 The OpenSSL Project Authors -Copyright 2006-2017 The OpenSSL Project Authors -Copyright 2017 BaishanCloud -Copyright 2005-2018 The OpenSSL Project Authors -Copyright (c) 2007 KISA(Korea Information Security Agency) -Copyright (c) 2012-2016 Jean-Philippe Aumasson -Copyright (c) 2012-2014 Daniel J. Bernstein -Copyright 2004-2021 The OpenSSL Project Authors -Copyright 2004-2019 The OpenSSL Project Authors -Copyright 2003-2018 The OpenSSL Project Authors -Copyright (c) 2004 Kungliga Tekniska Hogskolan (Royal Institute of Technology, Stockholm, Sweden) -Copyright 2003-2016 The OpenSSL Project Authors -Copyright 2013-2017 The OpenSSL Project Authors -Copyright 2015-2017 The OpenSSL Project Authors -Copyright 2012-2019 The OpenSSL Project Authors -Copyright 2003-2021 The OpenSSL Project Authors -Copyright 2006-2021 The OpenSSL Project Authors -Copyright 2019-2020 The OpenSSL Project Authors -Copyright 2003-2017 The OpenSSL Project Authors -Copyright 2002-2017 The OpenSSL Project Authors -Copyright 2020 The OpenSSL Project Authors -Copyright 2018-2019 The OpenSSL Project Authors -Copyright 2019 The OpenSSL Project Authors -Copyright 2015-2021 The OpenSSL Project Authors -Copyright 2009-2016 The OpenSSL Project Authors -Copyright (c) 1989, 1991 Free Software Foundation, Inc. -Copyright 2013 M. J. Dominus -Copyright 2013 Mark Jason Dominus -Copyright (c) 2018, Oracle and/or its affiliates -Copyright (c) 2006, Network Resonance, Inc. -Copyright (c) 2011, RTFM, Inc. -Copyright 2005-2021 The OpenSSL Project Authors -Copyright 2012-2018 The OpenSSL Project Authors -Copyright 2016-2016 The OpenSSL Project Authors -Copyright 2011-2017 The OpenSSL Project Authors -Copyright (c) 2016 Viktor Dukhovni -Copyright 1998-2001 The OpenSSL Project Authors -Copyright 2017 Ribose Inc. (https://www.ribose.com) - -License: OpenSSL Combined License -LICENSE ISSUES - ============== - - The OpenSSL toolkit stays under a dual license, i.e. both the conditions of - the OpenSSL License and the original SSLeay license apply to the toolkit. - See below for the actual license texts. Actually both licenses are BSD-style - Open Source licenses. In case of any license issues related to OpenSSL - please contact openssl-core@openssl.org. - - OpenSSL License - --------------- - -/* ==================================================================== - * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - - Original SSLeay License - ----------------------- - -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - -Software: zlib 1.3.1 -Copyright notice: -Copyright (c) 1995-2011, 2016 Mark Adler -Copyright (c) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler -Copyright (c) 1995-2022 Mark Adler -Copyright (c) 1995-2024 Jean-loup Gailly and Mark Adler -Copyright 1995-2024 Jean-loup Gailly and Mark Adler -Copyright (c) 1995-2024 Jean-loup Gailly -Copyright (c) 2004, 2010 Mark Adler -Copyright (c) 2004-2024 Mark Adler -Copyright (c) 2004-2017 Mark Adler -Copyright (c) 2004-2019 Mark Adler -Copyright (c) 1995-2017 Mark Adler -Copyright (c) 1995-2003, 2010 Mark Adler -Copyright (c) 1995-2019 Mark Adler -Copyright (c) 1995-2024 Mark Adler -Copyright 1995-2024 Mark Adler -Copyright (c) 1995-2005, 2010 Mark Adler -(c) 1995-2022 Jean-loup Gailly and Mark Adler -Copyright (c) 1995-2024 Jean-loup Gailly, Mark Adler -(c) 1995-2024 Jean-loup Gailly and Mark Adler -Copyright (c) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler -Copyright (c) 1995-2017 Jean-loup Gailly -Copyright (c) 1998 by Andreas R. Kleinert -Copyright Jean-loup Gailly Osma Ahvenlampi -Copyright (c) 2002-2004 Dmitriy Anisimkov -Copyright (c) 2002-2003 Dmitriy Anisimkov -Copyright (c) 2003, 2012, 2013 Mark Adler -Copyright (c) 1997,99 Borland Corp. -Copyright (c) 1997,99 Borland Corporation -Copyright (c) Henrik Ravn 2004 -Copyright (c) 2004 by Henrik Ravn -(c) Copyright Henrik Ravn 2004 -Copyright (c) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant -Copyright (c) 1995-2008 Mark Adler -Copyright (c) 2003 Mark Adler -Copyright (c) 1995-2003 Mark Adler -Copyright (c) 1997 Christian Michelsen Research AS Advanced Computing -Copyright (c) 1998-2005 Gilles Vollant -Copyright (c) 1998-2010 Gilles Vollant (minizip) -Copyright (c) 2009-2010 Mathias Svensson -Copyright (c) 2007-2008 Even Rouault -Copyright (c) 1998-2010 - by Gilles Vollant -Copyright (c) 1990-2000 Info-ZIP. -Copyright (c) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson -Copyright 1998-2004 Gilles Vollant -Copyright (c) 1995-2003 Jean-loup Gailly -Copyright (c) 1998 by Jacques Nomssi Nzali -Copyright (c) 2003 by Cosmin Truta -Copyright (c) 1995-2003 Jean-loup Gailly and Mark Adler -Copyright (c) 1998 by Bob Dellaca -Copyright (c) 1995-2003 by Jean-loup Gailly -Copyright (c) 1998,1999,2000 by Jacques Nomssi Nzali -Copyright (c) 2003 Cosmin Truta -Copyright (c) 2002-2013 Mark Adler -(c) 1995-2024 Jean-loup Gailly & Mark Adler -Copyright (c) 1996 L. Peter Deutsch and Jean-Loup Gailly -Copyright (c) 1996 L. Peter Deutsch -Copyright (c) 2007, 2008, 2012, 2018 Mark Adler -Copyright (c) 2003, 2005, 2008, 2010, 2012 Mark Adler -Copyright (c) 2003-2010 Mark Adler -Copyright (c) 2003, 2012 Mark Adler -Copyright (c) 2004, 2005, 2012 Mark Adler -Copyright (c) 2004, 2008, 2012, 2016, 2019 Mark Adler -Copyright (c) 2004, 2008, 2012 Mark Adler -Copyright (c) 2018 Mark Adler -Copyright (c) 2004-2023 Mark Adler -Copyright (c) 2005, 2012, 2018, 2023 Mark Adler -Copyright (c) 1995-1998 Jean-loup Gailly -Copyright (c) 1995-2017 Jean-Loup Gailly, Mark Adler -Copyright (c) 1995-2006, 2011, 2016 Jean-loup Gailly -Copyright (c) 2011, 2016 Mark Adler -Copyright (c) 1995-2006, 2010, 2011, 2016 Jean-loup Gailly -copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler -(c) 1995-2017 Jean-loup Gailly and Mark Adler -(c) 1995-2022 Jean-loup Gailly & Mark Adler - -License: zlib/libpng License -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not -claim that you wrote the original software. If you use this software -in a product, an acknowledgment in the product documentation would be -appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and must not be -misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. - -Software: curl 8.8.0 -Copyright notice: -Copyright (c) 2021 Free Software Foundation, Inc. -Copyright (c) Daniel Fandrich -Copyright (c) Michael Forney, -Copyright (c) James Fuller, -copyright When contributing -Copyright (c) Linus Nielsen Feltzing -Copyright (c) John Malmberg -Copyright (c) 2003-2021 Free Software Foundation, Inc. -Copyright (c) Howard Chu, -Copyright (c) Daniel Stenberg, -Copyright (c) Mark Gaiser, -Copyright (c) Howard Chu, -Copyright (c) Jan Venekamp, -Copyright (c) 2004, 2011-2019, 2021-2022 Free Software Foundation, Inc. -Copyright (c) 1996 - 2024, Daniel Stenberg, , and many contributors -Copyright (c) Nick Zitzmann, -Copyright (c) Dmitry Karpov -Copyright (c) Linus Nielsen Feltzing, -Copyright (c) 2004-2005, 2007-2009, 2011-2019, 2021-2022 Free Software Foundation, Inc. -Copyright (c) Bjorn Stenberg, -Copyright (c) 1999-2021 Free Software Foundation, Inc. -Copyright (c) 2011 Free Software Foundation, Inc. -Copyright (c) 1996-2019, 2021-2022 Free Software Foundation, Inc. -Copyright (c) Evgeny Grin -Copyright (c) , Daniel Stenberg -Copyright (c) 1996-2021 Free Software Foundation, Inc. -Copyright (c) Hoi-Ho Chan, -Copyright (c) 1996-2001, 2003-2019, 2021-2022 Free Software Foundation, Inc. -Copyright (c) 2008-2021 Free Software Foundation, Inc. -Copyright (c) 2002-2021 Free Software Foundation, Inc. -Copyright (c) 2004-2019, 2021 Bootstrap -Copyright 1992-2022 Free Software Foundation, Inc. -Copyright (c) 2006-2022 wolfSSL Inc. -Copyright (c) Florin Petriuc, -Copyright (c) 2004-2005, 2007, 2009, 2011-2019, 2021-2022 Free Software Foundation, Inc. -Copyright (c) Nicolas Sterchele, -Copyright (c) 1998 - 2022, Daniel Stenberg, -Copyright (c) Marc Hoersken, -Copyright (c) 1994 X Consortium -Copyright (c) Simon Josefsson, -Copyright (c) Steve Holme, -Copyright (c) Jay Satiro, -Copyright (c) Daniel Stenberg -Copyright (c) EdelWeb -Copyright (c) Bill Nagel , Exacq Technologies -Copyright (c) Mark Salisbury, -Copyright (c) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, Inc. -Copyright (c) Red Hat, Inc. -Copyright (c) Internet Software Consortium -Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Hogskolan (Royal Institute of Technology, Stockholm, Sweden) -Copyright (c) 1997-2021 Free Software Foundation, Inc. -Copyright (c) 2010-2019, 2021 Bootstrap -Copyright (c) Markus Moeller, -Copyright (c) Max Dymond, -Copyright (c) 2009-2021 Free Software Foundation, Inc. -Copyright (c) 1998, 1999 Kungliga Tekniska Hogskolan -Copyright (c) 2001-2021 Free Software Foundation, Inc. -Copyright (c) Mandy Wu, -Copyright (c) Jacob Hoffman-Andrews, -Copyright (c) 2006-2021 Free Software Foundation, Inc. -Copyright (c) 1994-2021 Free Software Foundation, Inc. -Copyright (c) Vijay Panghal, -Copyright (c) 1983, Regents -Copyright (c) 2004-2021 Free Software Foundation, Inc. -Copyright (c) David Shaw -Copyright (c) Jeroen Ooms -Copyright (c) Daniel Stenberg All rights reserved -Copyright (c) 1996-2022 Internet Software Consortium -Copyright (c) 2014 Free Software Foundation, Inc. -Copyright (c) 2004-2005, 2007-2008, 2011-2019, 2021-2022 Free Software Foundation, Inc. -Copyright (c) Daniel Stenberg -Copyright (c) 2008 - 2022, Daniel Stenberg, - -License: MIT License -COPYRIGHT AND PERMISSION NOTICE - -Copyright (c) 1996 - 2021, Daniel Stenberg, , and many -contributors, see the THANKS file. - -All rights reserved. - -Permission to use, copy, modify, and distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright -notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN -NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE -OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of a copyright holder shall not -be used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization of the copyright holder. - -Software: grpc 1.36.1 -Copyright notice: -Copyright 2016 gRPC -Copyright 2019 gRPC -Copyright 2017 gRPC -Copyright 2015 gRPC -Copyright 2014 gRPC -Copyright 2020 The gRPC authors -Copyright 2021 the gRPC authors -Copyright 2019 The gRPC authors -Copyright 2020 The -Copyright 2019 the gRPC authors -Copyright 2020 the gRPC authors -Copyright 2018 The -copyright 2020, The -(c) 1999 Entrust.net Limited -(c) 1999 Entrust.net Limited Label Entrust.net Premium 2048 Secure Server CA Serial -(c) 2006 Entrust, Inc. -(c) 2006 Entrust, Inc. Label Entrust Root Certification -(c) 2007 GeoTrust Inc. -(c) 2008 VeriSign, Inc. -(c) 2009 Entrust, Inc. - for -(c) 2012 Entrust, Inc. - for -(c) 2015 Entrust, Inc. - for -Copyright 2018 gRPC -Copyright 2018, gRPC -Copyright 2019 The -Copyright (c) 2020 -(c) 2018 gRPC. -Copyright 2020 gRPC -Copyright 2015-2016 gRPC -Copyright (c) 2018, Google Inc. -Copyright 2021 gRPC -Copyright 2015 The -Copyright 2017 The -Copyright 2019 The gRPC Authors -Copyright 2016 The -Copyright 2019, Google Inc. -Copyright 2016, Google Inc. -Copyright 2015, Google Inc. -copyrighted by Red Hat Inc. -copyrighted by Bloomberg Finance -Copyright 2014, Google Inc. -Copyright 2015-2017 gRPC -Copyright 2014 Google Inc. -Copyright 2021 The -Copyright 2016 Google Inc. -Copyright 2018 The gRPC Authors -Copyright 2021 The gRPC authors -Copyright 2020 The gRPC Authors -(c) (c) I -Copyright (c) 2016 -Copyright 2007 Google Inc. -Copyright (c) 1995, 1996, 1997, and 1998 WIDE Project -Copyright (c) 2009 - 2013 by Daniel Stenberg -Copyright 2019 Istio Authors -Copyright 2016 The Chromium Authors -Copyright 2013 Google Inc. -Copyright 2018 The Bazel Authors -Copyright 2019 The Bazel Authors -Copyright (c) 2009-2011, Google Inc. -Copyright 2008 Google Inc. -Copyright (c) 2006-2008 Michael Roth -Copyright (c) 2004-2010 Michael Roth -Copyright (c) 2004, 2006-2010 Michael Roth -Copyright (c) 2004-2009 Michael Roth -Copyright 2020 Wang Yi Wang Yi -Copyright (c) 2018 https://github.com/grpc/grpc/blob/master/AUTHORS - -License: Apache License V2.0 -Please see above - -Software: c-ares 1.19.1 -Copyright notice: -Copyright (c) 2009 Tom Howard -Copyright 2005 by Dominick Meglio -Copyright (c) 2005 by Dominick Meglio -Copyright (c) 2017 by John Schember -Copyright (c) 2017 - 2018 by Christian Ammer -Copyright (c) 2007-2013 by Daniel Stenberg -Copyright 2005 Dominick Meglio -Copyright (c) 2008 - 2012 by Daniel Stenberg -Copyright (c) 2012 by Gilles Chehade -Copyright (c) 2008 by Daniel Stenberg -Copyright (c) 2004 - 2013 by Daniel Stenberg -Copyright (c) 2004 - 2011 by Daniel Stenberg -Copyright (c) 2005, 2013 by Dominick Meglio -Copyright (c) 2012 Marko Kreen -Copyright (c) 2004 by Daniel Stenberg -Copyright (c) 2019 by Andrew Selivanov All rights reserved -Copyright (c) 1996,1999 by Internet Software Consortium -Copyright (c) 2004-2017 by Daniel Stenberg -Copyright (c) 2008 Tom Howard -Copyright (c) 2004-2010 by Daniel Stenberg -Copyright (c) 2004-2011 by Daniel Stenberg -Copyright (c) 2004 by Internet Systems Consortium, Inc. -Copyright (c) 2017 by John Schember -Copyright (c) 2008 Benjamin Kosnik -Copyright (c) 2012 Christian Persch -Copyright 2005, Google Inc. All rights reserved -Copyright (c) 2014, 2015 Google Inc. -Copyright (c) 2004-2009 by Daniel Stenberg -Copyright 2007, Google Inc. All rights reserved -Copyright 1998 by Daniel Stenberg -Copyright (c) 2018 by John Schember -Copyright (c) 2009-2013 by Daniel Stenberg -Copyright (c) 2015 Paul Norman -Copyright (c) 2009 - 2021 by Daniel Stenberg -Copyright (c) 2012 Paolo Borelli -Copyright (c) 2011 Daniel Richard G. -Copyright (c) 2009 by Jakub Hrozek -Copyright (c) 2019 Marc Stevens -Copyright (c) 1996-1999 by Internet Software Consortium -Copyright (c) 2008 John Darrington -Copyright (c) 1987-2001 The Regents -Copyright (c) 2019 by Andrew Selivanov -Copyright (c) 2008 Steven G. Johnson -Copyright (c) 2012 Zack Weinberg -Copyright 2015, Google Inc. All rights reserved -Copyright 2013, Google Inc. All rights reserved -Copyright (c) 2021 by Brad House -Copyright (c) 2013 Roy Stogner -Copyright (c) 2007 - 2018, Daniel Stenberg -Copyright 2010 by Ben Greear -Copyright (c) 2004 - 2012 by Daniel Stenberg -Copyright (c) 2020 Jason Merrill -Copyright 2020 Danny Sonnenschein -Copyright (c) 2019 Enji Cooper -Copyright (c) 2008 - 2013 by Daniel Stenberg -Copyright (c) 2021 Jorn Heusipp -Copyright (c) 2009 Allan Caffee -Copyright (c) 2005 - 2010, Daniel Stenberg -Copyright (c) 2012 Xan Lopez -Copyright (c) 2012 Dan Winship -Copyright 2008 Google Inc. All Rights Reserved -Copyright (c) 2008-2010 by Daniel Stenberg -Copyright (c) 2008-2013 by Daniel Stenberg -Copyright (c) 2013 by Daniel Stenberg -Copyright (c) 2014 Mike Frysinger -Copyright (c) 2021 Permission -Copyright (c) 2015 Moritz Klammler -Copyright (c) 2010 Jeremy Lal -Copyright (c) 2013 Daniel Stenberg -Copyright 2006, Google Inc. All rights reserved -Copyright (c) 2005-2013 by Daniel Stenberg -Copyright 2008, Google Inc. All rights reserved -Copyright (c) 2012, 2016 Philip Withnall -Copyright (c) 2009-2021 by Daniel Stenberg -Copyright (c) 2008 - 2009 by Daniel Stenberg -Copyright (c) 2016, 2018 Krzesimir Nowak -Copyright (c) 2010-2012 by Daniel Stenberg -Copyright (c) 2010-2013 by Daniel Stenberg -Copyright (c) 2015 Enrico M. Crisostomo -Copyright (c) 2015,2018 Bastien ROUCARIES -Copyright 2004 by Daniel Stenberg -Copyright (c) 2011 Daniel Stenberg -Copyright 2020 by -Copyright (c) 2016 by Daniel Stenberg -Copyright (c) 2018 The Android Open Source Project -Copyright (c) 1995, 1996, 1997, and 1998 WIDE Project - -License: MIT License -Please see above - -Software: re2 2019-12-01 -Copyright notice: -Copyright (C) 2009 The Android Open Source Project -Copyright (C) 2009 Free Software Foundation, Inc. -Copyright 2016 The RE2 Authors. All Rights Reserved. -Copyright 2004 The RE2 Authors. All Rights Reserved. -Copyright 2006 The RE2 Authors. All Rights Reserved. -Copyright 2006-2007 The RE2 Authors. All Rights Reserved. -Copyright (c) 2002 by Lucent Technologies. -Copyright 2010 The RE2 Authors. All Rights Reserved. -Copyright 2006-2008 The RE2 Authors. All Rights Reserved. -Copyright 2005 The RE2 Authors. All Rights Reserved. -Copyright 2008 The RE2 Authors. All Rights Reserved. -Copyright 2003-2010 Google Inc. All Rights Reserved. -Copyright 2007 The RE2 Authors. All Rights Reserved. -Copyright 2009 The RE2 Authors. All Rights Reserved. -Copyright 2001-2010 The RE2 Authors. All Rights Reserved. -Copyright 2002-2009 The RE2 Authors. All Rights Reserved. -Copyright (c) 2009 The RE2 Authors. All rights reserved. -Copyright 2018 The RE2 Authors. All Rights Reserved. -Copyright 2003-2009 The RE2 Authors. All Rights Reserved. -Copyright 2003-2009 Google Inc. All rights reserved. -Copyright 1999-2005 The RE2 Authors. All Rights Reserved. -Copyright 2015 The RE2 Authors. All Rights Reserved. - -License: BSD 3-Clause License -Please see above - -Software: abseil-cpp 20240722 -Copyright notice: -Copyright (c) 2016–2024 Google Inc. -Copyright (c) 2017–2024 The Abseil Authors - -License: -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and -You must cause any modified files to carry prominent notices stating that You changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. -You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -Software: pcre 8.45 -Copyright notice: -Copyright (c) 2021 Free Software Foundation, Inc. -Copyright (c) 2011-2020 Free Software Foundation, Inc. -Copyright (c) 2002-2020 Free Software Foundation, Inc. -Copyright (c) 1997-2020 Free Software Foundation, Inc. -Copyright (c) 2009-2020 Free Software Foundation, Inc. -Copyright (c) 1994-1996, 1999-2002, 2004-2016 Free Software Foundation, Inc. -Copyright (c) 2005, Google Inc. All rights reserved -Copyright (c) 2006-2020 Free Software Foundation, Inc. -(c) 2001 Alexander Tokarev -Copyright (c) 1994-2020 Free Software Foundation, Inc. -Copyright 1992-2020 Free Software Foundation, Inc. -Copyright (c) 1997-2014 University of Cambridge -Copyright (c) 2003-2020 Free Software Foundation, Inc. -Copyright (c) 2001, Alexander Tokarev All rights reserved -Copyright (c) 1996-2020 Free Software Foundation, Inc. -Copyright (c) 2005, 2008, 2010-2011 Free Software Foundation, Inc. -Copyright (c) 2005 - 2010, Google Inc. All rights reserved -Copyright (c) 1996-2018 Free Software Foundation, Inc. -Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved -Copyright (c) 2010-2020 Free Software Foundation, Inc. -Copyright (c) 1997-2021 University of Cambridge All rights reserved -Copyright (c) 2011 Free Software Foundation, Inc. -Copyright (c) 2011 Daniel Richard G. -Copyright (c) 1997-2021 University of Cambridge -Copyright (c) 2010-2012 Zoltan Herczeg -Copyright (c) 2010-2013 Zoltan Herczeg -Copyright (c) 2008 Steven G. Johnson -Copyright (c) 1996-2001, 2003-2018 Free Software Foundation, Inc. -Copyright (c) 2004, 2011-2018 Free Software Foundation, Inc. -Copyright (c) 2004-2018 Bootstrap -Copyright 2013-2013 Tilera Corporation(jiwang@tilera.com). All rights reserved -Copyright (c) 2004-2020 Free Software Foundation, Inc. -Copyright (c) 1997-2016 University of Cambridge -Copyright (c) 1994 X Consortium -Copyright (c) 1997-2013 University of Cambridge -Copyright (c) 2004-2005, 2007-2008, 2011-2018 Free Software Foundation, Inc. -(c) 2001 Peter S. Voronov -Copyright (c) 1997-2004 University of Cambridge -Copyright (c) 2004-2005, 2007-2009, 2011-2018 Free Software Foundation, Inc. -Copyright (c) 2010-2021 Zoltan Herczeg All rights reserved -Copyright (c) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, Inc. -Copyright (c) 1999-2020 Free Software Foundation, Inc. -Copyright (c) 2007-2012 Google Inc All rights reserved -Copyright (c) 2004-2005, 2007, 2009, 2011-2018 Free Software Foundation, Inc. -Copyright (c) 2010, Google Inc. All rights reserved -Copyright (c) 1997-2020 University of Cambridge -Copyright 2003 and onwards Google Inc. -Copyright (c) 2009-2021 Zoltan Herczeg All rights reserved -Copyright (c) 2010-2018 Bootstrap -Copyright (c) 2004 Scott James Remnant -Copyright (c) 2001-2020 Free Software Foundation, Inc. -Copyright (c) 2007-2012, Google Inc. All rights reserved -(c) Auxiliary files -Copyright (c) 1997-2017 University of Cambridge -Copyright (c) 2012-2015 Dan Nicholson -Copyright (c) 2014 Free Software Foundation, Inc. -Copyright (c) 1997-2012 University of Cambridge - -License: BSD 3-Clause License -Please see above - -Software: libiconv 1.15 -Copyright notice: -Copyright (C) 2001-2002, 2005-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 2001-2002, 2006-2017 Free Software Foundation, Inc. -Copyright (C) 1996-2015 Free Software Foundation, Inc. -Copyright (C) 1999-2002, 2011-2012, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2004, 2006-2007, 2010, 2012, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2002, 2012 Free Software Foundation, Inc. -Copyright (C) 2009-2017 Free Software Foundation, Inc. -Copyright (C) 2010-2017 Free Software Foundation, Inc. -Copyright (C) 2000-2009, 2011-2012, 2016-2017 Free Software Foundation, Inc. -Copyright (C) 1999-2003, 2008 Free Software Foundation, Inc. -Copyright (C) 1999-2002, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2001, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2005, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2001, 2012, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2002, 2006, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2002, 2006, 2010 Free Software Foundation, Inc. -Copyright (C) 1999-2001, 2005, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2001 Free Software Foundation, Inc. -Copyright (C) 1999-2002 Free Software Foundation, Inc. -Copyright (C) 1999-2005, 2012, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2002, 2004-2011, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2001, 2004, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2012, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2011, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2002, 2005, 2016 Free Software Foundation, Inc. -Copyright (C) 2005, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2001, 2005, 2007, 2016 Free Software Foundation, Inc. -Copyright (C) 2001, 2005, 2016 Free Software Foundation, Inc. -Copyright (C) 2001, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2001, 2007, 2016 Free Software Foundation, Inc. -Copyright (C) 2001 Free Software Foundation, Inc. -Copyright (C) 1999-2001, 2005, 2012, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2001, 2005, 2011, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2001, 2005, 2008, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2000, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2001, 2003, 2005, 2008, 2012 Free Software Foundation, Inc. -Copyright (C) 1999-2003, 2005, 2008, 2012 Free Software Foundation, Inc. -Copyright (C) 2000-2002, 2005-2006, 2008-2009, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2003, 2005, 2011-2012, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2006, 2012, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2010, 2012, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2001, 2008, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2008, 2011, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2008, 2011 Free Software Foundation, Inc. -Copyright (C) 1999-2009 Free Software Foundation, Inc. -Copyright (C) 1999-2004, 2008, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2001, 2008, 2011-2012, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2004, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2004, 2012 Free Software Foundation, Inc. -Copyright (C) 1999-2007, 2012, 2016 Free Software Foundation, Inc. -Copyright (C) 2000 Free Software Foundation, Inc. -Copyright (C) 1999-2003, 2005-2006, 2008 Free Software Foundation, Inc. -Copyright (C) 2000-2002, 2005-2006, 2008-2009, 2011 Free Software Foundation, Inc. -Copyright (C) 2003-2006, 2008-2012 Free Software Foundation, Inc. - -Copyright (C) 2003, 2005, 2008-2011 Free Software Foundation, Inc. -Copyright (C) 1999-2007, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2002, 2004, 2016 Free Software Foundation, Inc. -Copyright (C) 1999-2003 Free Software Foundation, Inc. -Copyright (C) 1999-2001, 2008, 2011, 2016 Free Software Foundation, Inc. -Copyright (C) 2001, 2004, 2011 Free Software Foundation, Inc. -Copyright (C) 1995, 1999, 2001-2007 Free Software Foundation, Inc. -Copyright (C) 2011-2017 Free Software Foundation, Inc. -Copyright (C) 2001, 2003-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 2001, 2003-2004, 2007, 2009-2017 Free Software Foundation, -Inc. -Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2017 Free Software -Copyright (C) 2001, 2003, 2005, 2008-2017 Free Software Foundation, Inc. -Copyright (C) 2000-2003, 2006, 2008-2017 Free Software Foundation, Inc. -Copyright (C) 1996-2017 Free Software Foundation, Inc. -Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2017 Free Software -Copyright (C) 1998, 2001, 2003-2006, 2009-2017 Free Software Foundation, -Copyright (C) 2000-2001, 2004-2006, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 2008-2017 Free Software Foundation, Inc. -Copyright (C) 1990-1998, 2000-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 1995-1997, 2003, 2006, 2008-2017 Free Software Foundation, -Copyright (C) 2006-2017 Free Software Foundation, Inc. -Copyright (C) 2016-2017 Free Software Foundation, Inc. -Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2017 Free Software -Copyright (C) 2001-2003, 2005-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 2001-2017 Free Software Foundation, Inc. -Copyright 2016-2017 Free Software Foundation, Inc. -Copyright (C) 2000-2003, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 1997-2006, 2008-2017 Free Software Foundation, Inc. -Copyright (C) 1997-1998, 2006-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 2003, 2006-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 2003-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 1992, 1999, 2001, 2003, 2005, 2009-2017 Free Software -Copyright (C) 2001-2003, 2005-2017 Free Software Foundation, Inc. -Copyright (C) 2001-2004, 2006, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 2003-2017 Free Software Foundation, Inc. -Copyright (C) 2002-2003, 2005-2006, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 2003-2006, 2008-2017 Free Software Foundation, Inc. -Copyright (C) 2003, 2005, 2008-2017 Free Software Foundation, Inc. -Copyright (C) 2003, 2005-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 1993-1994, 1998, 2002-2006, 2009-2017 Free Software -Copyright (C) 2002, 2006, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 1992, 1995-2003, 2005-2017 Free Software Foundation, Inc. -Copyright (C) 2001-2003, 2006-2017 Free Software Foundation, Inc. -Copyright (C) 2001-2002, 2004-2017 Free Software Foundation, Inc. -Copyright (C) 2004, 2007-2017 Free Software Foundation, Inc. -Copyright (C) 1995, 2001-2004, 2006-2017 Free Software Foundation, Inc. -Copyright (C) 2001-2002, 2007, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 2007-2017 Free Software Foundation, Inc. -Copyright (C) 1995-1996, 2001-2017 Free Software Foundation, Inc. -Copyright (C) 1990, 2001, 2003-2006, 2009-2017 Free Software Foundation, -Copyright (C) 2005-2017 Free Software Foundation, Inc. -Copyright (C) 2002, 2005-2006, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 2001-2002, 2005, 2007, 2009-2017 Free Software Foundation, -Copyright (C) 2001-2004, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 2005-2006, 2009-2017 Free Software Foundation, Inc. -Copyright (C) 1990-2000, 2003-2004, 2006-2017 Free Software Foundation, Inc. -Copyright (C) 2001-2004, 2006 Free Software Foundation, Inc. -Copyright (C) 1990-1996, 2000-2003, 2005-2007 Free Software Foundation, Inc. -Copyright (C) 1990, 1996, 2000-2003, 2005-2006 Free Software Foundation, Inc. -Copyright (C) 2005, 2012 Free Software Foundation, Inc. -Copyright (C) 2000, 2004-2005, 2012, 2016 Free Software Foundation, Inc. -Copyright (C) 2000-2002, 2004-2005 Free Software Foundation, Inc. -Copyright (C) 2008 Free Software Foundation, Inc. -Copyright (C) 2009, 2011 Free Software Foundation, Inc. -Copyright (C) 86, 91, 1995-1998, 1999, 2012 Free Software Foundation, Inc. -Copyright (C) 1999-2001, 2003, 2011 Bruno Haible. -Copyright (C) 1999-2001 Bruno Haible. -Copyright (C) 2006, 2011-2012 Free Software Foundation, Inc. -Copyright (C) 2006 Free Software Foundation, Inc. -Copyright (C) 2000-2004, 2006-2010 Free Software Foundation, Inc. -Copyright (C) 2000-2006, 2008-2012 Free Software Foundation, Inc. -Copyright (C) 2007 Free Software Foundation, Inc. -Copyright (C) 1991 Free Software Foundation, Inc. - -License: LGPL V2.0 -GNU Library General Public License -Version 2, June 1991 - -Copyright (C) 1991 Free Software Foundation, Inc. -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. - -[This is the first released version of the Library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] - -Preamble -The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. - -This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to other libraries whose authors who decide to use it. You can use it for your libraries too. - -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. - -To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. - -For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. - -Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license, which gives you legal permission to copy, distribute and/or modify the library. - -Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. - -Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. - -Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. - -The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. - -Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. - -However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. - -The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. - -Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. - -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". - -A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. - -The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) - -"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. - -Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. - -1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. - -You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - -a) The modified work must itself be a software library. - -b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - -c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. - -d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. - -(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - -3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - -Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. - -This option is useful when you wish to copy part of the code of the Library into a program that is not a library. - -4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. - -If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. - -5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. - -However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. - -When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. - -If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) - -Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - -6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. - -You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: - -a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) - -b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. - -c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. - -d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. - -For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - -It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - -7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: - -a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. - -b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. - -8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - -9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. - -10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. - -11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. - -This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - -12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - -13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - -14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - -NO WARRANTY - -15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -END OF TERMS AND CONDITIONS - - -How to Apply These Terms to Your New Libraries -If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). - -To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - -one line to give the library's name and an idea of what it does. -Copyright (C) year name of author - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: - -Yoyodyne, Inc., hereby disclaims all copyright interest in -the library `Frob' (a library for tweaking knobs) written -by James Random Hacker. - -signature of Ty Coon, 1 April 1990 -Ty Coon, President of Vice - -That's all there is to it! - -Software: libxml2 2.9.12 -Copyright notice: -Copyright (c) 1998-2012 Daniel Veillard -Copyright (c) 2003-2012 Daniel Veillard -Copyright (c) 2000,2012 Bjorn Reese and Daniel Veillard -Copyright (c) 2000 Gary Pennington and Daniel Veillard -Copyright 2003 Red Hat, Inc. -Copyright (c) 2010-2017 Christopher Swenson -Copyright (c) 2012 Vojtech Fried -Copyright (c) 2012 Google Inc. -Copyright (c) 1998 Bjorn Reese and Daniel Stenberg -Copyright (c) 2001 Bjorn Reese -Copyright (c) 2000 Bjorn Reese and Daniel Stenberg -Copyright (c) 2001 Bjorn Reese and Daniel Stenberg -Copyright (c) 2002, 2003 John Fleck -Copyright (c) 1998-2017 Daniel Veillard -(c) 1999, 2000 WAP Forum Ltd. -(c) 2000 GameSquad.net -Copyright (c) 1999-2000 BP6.com -(c) Copyright Microsoft Corporation, 1999 -Copyright (c) 1994-99 Wired Digital Inc. -copyright Netscape Communications, 1999 Dan Libby -(c) International Organization -Copyright (c) 1999 http://www.w3.org/' W3C ( http://www.lcs.mit.edu/' MIT, http://www.inria.fr/' INRIA, http://www.keio.ac.jp/' Keio ) -Copyright (c) The Organization for the Advancement of Structured Information Standards OASIS 2001 -Copyright 2000 Example.com -Copyright (c) IPTC, 2000 -Portions (c) International Organization -Copyright (c) 1998-1999 W3C (MIT, INRIA, Keio) -Copyright (c) Daniel Veillard - -License: MIT License -Please see above - -Software: cJSON 1.7.17 -Copyright notice: -Copyright (c) 2009-2017 Dave Gamble and cJSON contributors -Copyright (c) 2009-2019 Dave Gamble and cJSON contributors -Copyright 2014 The Authors -Copyright (c) 2007 - 2017 Unity Project by Mike Karlesky, Mark VanderVoord, and Greg Williams -Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams -Copyright (c) 2015 Alexander Mueller / XelaRellum@web.de -Copyright (c) 2007-14 Mike Karlesky, Mark VanderVoord, Greg Williams -Copyright (c) 2010 James Grenning and Contributed to Unity Project - -License: MIT License -Please see above - -Software: huaweicloud-sdk-c-obs 3.24.3 -Copyright notice: -Copyright (c) 2008-10 Intel Corp -(c) Copyright 2002, Greg Ungerer (gerg@snapgear.com) -Copyright (c) 2018, Daniel Stenberg, -Copyright (c) 1999,2000 Martin Lucina, Tom Zerucha -Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) -Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -Copyright IBM Corp. 1999,2006 -Copyright (c) 2014 Nicira, Inc. -(c) 2005 Thibaut VARENE -Copyright (c) 1999-2002 Matthew Dharm (mdharm-usb@one-eyed-alien.net) -Copyright (c) 1989-1994,1996-1999,2001,2003,2004,2009 Free Software Foundation, Inc. -Copyright (c) 2014 SUSE -Copyright (c) 2000,2002 Stephen Rothwell -(c) 2003 - 2004 David Woodhouse -Copyright (c) 1991-1993,96,98,2000-2003,2004 Free Software Foundation, Inc. -Copyright (c) 2011 ST Microelectronics Viresh Kumar -Copyright (c) 2000-2010 David Woodhouse -Copyright (c) 2001 Paul Diefenbaugh -Copyright (c) 2002-2006, Network Appliance, Inc. All rights reserved -Copyright (c) 2006,2007 Red Hat, Inc., Ingo Molnar -Copyright (c) 1994-1996 Greg Ungerer -Copyright (c) 2004-2013 Free Software Foundation, Inc. -Copyright (c) 2001-2008 The OpenSSL Project. All rights reserved -Copyright (c) 2013 - 2018, Daniel Stenberg, -Copyright (c) 2005, 2006 Free Software Foundation, Inc. -Copyright (c) 2008 QUALCOMM USA, INC. -Copyright (c) 2006 Tower Technologies -Copyright (c) 2005 Maciej W. Rozycki -Copyright (c) 1997 Martin Mares -Copyright (c) 1999 Machine Vision Holdings, Inc. -Copyright (c) 2007-2008 Advanced Micro Devices, Inc. -Copyright (c) 2006 Sylvain Munaut -Copyright (c) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc. -Copyright (c) 1997-2006, 2008-2017 Free Software Foundation, Inc. -Copyright (c) 2011 Mellanox Technologies LTD. All rights reserved -Copyright (c) 2012 Intel Corporation. All rights reserved -Copyright (c) 2006 Benjamin Herrenschmidt, IBM Corp. -Copyright (c) 2011 Steffen Klassert -Copyright (c) 2007 Lawrence Livermore National Lab -Copyright 2003,2004 Andi Kleen SuSE Labs -Copyright (c) 1990, 1991, 2003 Linas Vepstas -Copyright (c) 2003+ Evgeniy Polyakov -Copyright (c) 2001 James Morris -Copyright (c) Tom Long Nguyen (tom.l.nguyen@intel.com) -Copyright (c) 1991, 1992, 1996, 1998, 1999 Free Software Foundation, Inc. -Copyright 2000 Copyright@2001 Baltimore Technologies Ltd. -Copyright (c) 2003-2013 Free Software Foundation, Inc. -Copyright (c) 2004 Ian Molton -Copyright (c) 2001 Sistina Software (UK) Limited -Copyright 2003-2004 Red Hat, Inc. All rights reserved -Copyright (c) 2005, 2006, 2008, 2009 Free Software Foundation, Inc. -Copyright (c) 2005 Dmitry Torokhov -Copyright (c) 1997, 1998, 2004 Free Software Foundation, Inc. -Copyright (c) 1991,1992,1994-2001,2003,2004,2007 Free Software Foundation, Inc. -Copyright (c) 2004-2006, Sara Golemon All rights reserved -Copyright 2011 Red Hat, Inc. All rights reserved -Copyright (c) 1995, 1996, 1997, 2000, 2002 Free Software Foundation, Inc. -Copyright (c) 2003, 2005-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (c) 2013, Intel Corporation -Copyright (c) 2003, 2012, 2013 Mark Adler -Copyright (c) 2005, Red Hat, Inc., Ingo Molnar -Copyright 2009 Red Hat, Inc. -Copyright (c) 1996, 1997, 1999, 2003, 2004, 2007 Free Software Foundation, Inc. -Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved -Copyright (c) 1996 Larry Ewing (lewing@isc.tamu.edu) -Copyright (c) 2006-2007 Jiri Kosina -Copyright (c) 2012 Renesas Solutions Corp. Kuninori Morimoto -Copyright (c) 1995-2006, 2010, 2011, 2016 Jean-loup Gailly -Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. -Copyright (c) 2008-2011 Jonathan Cameron -Copyright (c) Evgeniy Polyakov All rights reserved -Copyright (c) 1999-2000, 2016 Free Software Foundation, Inc. -Copyright (c) 1998, 1999, 2000, 2004, 2006 Free Software Foundation -Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2002-2013 Free Software Foundation, Inc. -Copyright 2005-2008 Wolfson Microelectronics -Copyright (c) 1998, 1999, 2001 David Mosberger-Tang -Copyright (c) 2008-2013 Free Software Foundation, Inc. -Copyright 2008 Simtec Electronics Ben Dooks -Copyright (c) 2007-2013 ST-Ericsson -Copyright (c) IBM Corp. 2004-2005 -Copyright 1991-1998 by Bell Labs -Copyright (c) 1995, 1996, 1997, 2000, 2002, 2004, 2009 Free Software Foundation, Inc. -Copyright (c) 2001 PPC64 Team, IBM Corp -Copyright (c) 2003-2011 Jozsef Kadlecsik -Copyright (c) 1995-2001,2004 Silicon Graphics, Inc. All Rights Reserved -Copyright (c) 2010, Howard Chu, -Copyright (c) 2005 Network Appliance, Inc. All rights reserved -Copyright (c) 2007 Eurotech S.p.A. -Copyright (c) 2008-2009 Nokia Corporation -(c) 2002 Nadia Yvette Chambers, IBM -Copyright (c) 2007-2013 Free Software Foundation, Inc. -Copyright (c) 2005 Arnaldo Carvalho de Melo -Copyright (c) 1998 Dag Brattli , All Rights Reserved -Copyright (c) ST-Ericsson SA 2007-2010 -Copyright (c) 1998 by Bob Dellaca -Copyright 2009 Daniel Ribeiro -Copyright (c) 2009 Nokia Corporation -(c) 2012 by Lemonage GmbH -Copyright (c) 2001-2004, 2009-2017 Free Software Foundation, Inc. -Copyright (c) 2009 IBM Corporation -Copyright 2010-2011 Texas Instruments Inc. -Copyright (c) 2009, 2010 Imagination Technologies Ltd. -Copyright (c) 2008-2011, Intel Corporation -Copyright (c) 2009-2010 Gustavo F. Padovan -Copyright (c) 2000-2001 The OpenSSL Project. All rights reserved -Copyright (c) 1989, 1993 The Regents -Copyright (c) 2006 Nick Piggin -Copyright (c) 2000-2013 Free Software Foundation, Inc. -Copyright (c) 2003 MontaVista Software Inc. -Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de) -Copyright (c) 2008-2009 ST-Ericsson AB -Copyright (c) 2005-2008 Nippon Telegraph and Telephone Corporation -Copyright (c) 2009-2010 Mellanox Technologies. All rights reserved -Copyright 2008 Thomas Bogendoerfer -Copyright (c) 2001-2003, 2005-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (c) 2003-2013 Jozsef Kadlecsik -Copyright (c) 2011 Kees Cook -Copyright (c) 1999-2001, 2004, 2016 Free Software Foundation, Inc. -Copyright (c) 1998, 1999 Hewlett-Packard Co -Copyright (c) 2012-2013, NVIDIA CORPORATION. All rights reserved -Copyright (c) 1998 - 2018, Florin Petriuc, -Copyright (c) 2010, Intel Corp. -Copyright (c) 2003 Chris Anderson 2005 - Adaptation -Copyright (c) 2001-2008, Lars Ellenberg -Copyright (c) 2012 Imagination Technologies -Copyright (c) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler -(c) Deep Root Systems, LLC. -Copyright (c) 2004 IBM Corp. -Copyright (c) 2001 Free Software Foundation, Inc. -Copyright (c) 2007 Anton Vorontsov -Copyright (c) 2005-2013 Free Software Foundation, Inc. -Copyright 2001, LifeLine Networks BV (www.lifeline.nl). All rights reserved -Copyright (c) 2004, 2006, 2008 Free Software Foundation, Inc. -Copyright (c) 2003 by Cosmin Truta -Copyright (c) 2013-2015 Marc Hoersken -Copyright (c) 2006 Alex Dubov -Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. -Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2002 Theo de Raadt -Copyright (c) 1983, 1987, 1989 The Regents -Copyright (c) 2009 Texas Instruments Incorporated - http://www.ti.com -Copyright (c) 2003, 2005, 2008-2017 Free Software Foundation, Inc. -Copyright (c) 2008, 2009 Steffen Klassert -Copyright (c) 2012 Roland Stigge -Copyright 2001-2018 The OpenSSL Project Authors. All Rights Reserved -Copyright 2008 Luis Carlos Cobo -Copyright (c) 1995,1996,1997,2003,2006,2007 Free Software Foundation, Inc. -Copyright (c) 1998-1999 Dag Brattli , All Rights Reserved -Copyright (c) 1983, 1989, 1993 The Regents -Copyright (c) 2011 Texas Instruments Incorporated - http://www.ti.com -Copyright (c) 1991, 1992, 1996, 1999 Free Software Foundation, Inc. -Copyright (c) 2013 Red Hat, Inc. All Rights Reserved -Copyright (c) 1991, 1992, 1995-2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc. -Copyright (c) 2007-2008 Intel Corporation Inaky Perez-Gonzalez -Copyright (c) 2006, Ian Campbell, XenSource Ltd. -Copyright (c) 2003, 2005, 2006 Free Software Foundation, Inc. -Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved -(c) Copyright 2005 Benjamin Herrenschmidt -Copyright (c) 2005-2007 Kristian Hoegsberg -Copyright (c) 2009-2014 by Daniel Stenberg -Copyright MontaVista Software, Inc. -Copyright (c) 2012, Red Hat, Inc. Rafael Aquini -Copyright (c) 1997,1998,1999,2000,2001,2004 Free Software Foundation, Inc. -Copyright (c) 1999 The OpenSSL Project. All rights reserved -Copyright (c) 2008,2009 Intel Corporation -Copyright (c) 1983, 1989 The Regents -Copyright (c) 2006. Bob Jenkins (bob_jenkins@burtleburtle.net) -Copyright 1997 Transmeta Corporation -Copyright (c) Henrik Ravn 2004 -Copyright 1999 by Carsten Paeth (calle@calle.in-berlin.de) -Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. -Copyright (c) 1996, 1997, 1999, 2000, 2002-2004, 2005, 2007, 2009 Free Software Foundation, Inc. -Copyright (c) 2009, Guennadi Liakhovetski -Copyright (c) 1999, 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation -Copyright (c) 2002,2003 Suresh Siddha -Copyright (c) 1995-1998 Eric A. Young, Tim J. Hudson -Copyright (c) 2011 Christian Strobel -Copyright (c) 1999-2002, 2006, 2010 Free Software Foundation, Inc. -Copyright (c) 2001-2003 Stelian Pop -Copyright (c) 1996, 1997, 1999, 2000 Free Software Foundation, Inc. -Copyright 2002 John Levon -Copyright (c) 2000 Thomas Sailer (sailer@ife.ee.ethz.ch) -Copyright (c) 2006-2010. QLogic Corporation. All rights reserved -Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2001-2017 Free Software Foundation, Inc. -Copyright (c) 2005, 2006, 2007 Cisco Systems, Inc. All rights reserved -Copyright (c) 1997 by Procom Technology, Inc. 2001, 2002 by Arnaldo Carvalho de Melo -Copyright (c) 2010-2011 Texas Instruments Incorporated - http://www.ti.com All rights reserved -Copyright (c) 2010 Red Hat, Inc. All rights reserved -Copyright (c) 2006-2007 Sylvain Munaut -Copyright (c) 1998-1999, Aage Kvalnes -Copyright (c) 2007 Jens Axboe -Copyright (c) 1995-2003,2004,2005,2006,2007,2008,2009 Free Software Foundation, Inc. -Copyright (c) 1996-2002,2005,2007,2008,2009 Free Software Foundation, Inc. -Copyright (c) 2009 Rodolfo Giometti -Copyright (c) 2004-2006 Voltaire Corporation. All rights reserved -Copyright (c) 2006 IBM Corporation, Timothy R. Chavez -Copyright Wolfson Microelectronics -Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved -Copyright (c) 1996-2001, 2004 Free Software Foundation, Inc. -Copyright (c) 1998, 1999, 2000, 2001, 2004, 2005 Free Software Foundation -Copyright (c) 1995-1998 Jean-loup Gailly -Copyright 2002, Log4cpp Project. All rights reserved -Copyright (c) 1999, 2003 Hewlett-Packard Co David Mosberger-Tang -(c) 2008-2009 Nicholas A. Bellinger -Copyright 2007 Secret Lab Technologies Ltd. -Copyright (c) 2006, Network Resonance, Inc. -Copyright (c) 2008, Intel Corporation -Copyright (c) 1992, 1996, 1997, 2004 Free Software Foundation, Inc. -Copyright (c) 2010 Texas Instruments, Inc. -Copyright (c) 2010 by Daniel Stenberg -Copyright (c) 2005 Nguyen Anh Quynh -Copyright 2003 Vivien Chappelier -Copyright (c) 1998 - 2011, 2018, Daniel Stenberg, -Copyright (c) 1999 Stephane Eranian -Copyright (c) 2002 SGI - Silicon Graphics, Inc -Copyright 2002 Andy Grover -Copyright (c) 1998, 1999, 2002 Free Software Foundation -Copyright (c) 2008, 2009 secunet Security Networks AG -Copyright (c) 2012 Samsung Electronics Co. -Copyright (c) Jay Lan SGI -Copyright (c) 2000 Bjorn Reese and Daniel Stenberg -Copyright (c) 2008-2009, Red Hat, Inc., Peter Zijlstra -Copyright (c) 2007 Stefan Kopp, Gechingen, Germany -Copyright (c) 1997, 1999, 2000, 2004 Free Software Foundation, Inc. -Copyright (c) 2016, Steve Holme, -Copyright (c) 2012 Dialog Semiconductor -(c) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 EMC Symmetrix ioctl -Copyright (c) 2006-2017 Free Software Foundation, Inc. -Copyright (c) 2001, 2004, 2011 Free Software Foundation, Inc. -Copyright (c) 2000-2005 Thomas Gleixner -Copyright (c) 2000 Jaroslav Kysela -Copyright (c) 2003-2016 CORE Security Technologies -Copyright (c) 1997-2014 University of Cambridge -Copyright (c) 1996-2012 Markus F.X.J. Oberhumer -Copyright (c) 2013 - 2018, Linus Nielsen Feltzing -Copyright (c) 2001-2013 Free Software Foundation, Inc. -Copyright (c) 2005-2007 Intel Corporation Inaky Perez-Gonzalez -Copyright (c) 2007-2012 Siemens AG -Copyright (c) 2002-2009 Mellanox Technologies LTD. All rights reserved -Copyright (c) 1995-2017 Mark Adler -Copyright (c) 2001, 2006 IBM Corporation -Copyright (c) 2000-2001 Vojtech Pavlik -Copyright 2011-2013 Texas Instruments Inc. -Copyright (c) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -Copyright (c) 2002 Intrinsyc Software Inc. -Copyright (c) 2007, 2008, 2009 Free Software Foundation, Inc. -Copyright (c) 1997,1998,1999,2000,2001,2006 Free Software Foundation, Inc. -Copyright (c) 2009, 2010 Simon Josefsson -Copyright (c) 1997, 1998, 1999, 2003 Free Software Foundation, Inc. -Copyright (c) 2008, 2010 Simon Josefsson -Copyright (c) 2006, 2007 The -Copyright (c) 2005, Thomas Gleixner -Copyright (c) ARM Limited 2003. All rights reserved -Copyright (c) 2001 Brian S. Julin All rights reserved -Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved -Copyright (c) 2006-2008 Greg Kroah-Hartman -Copyright (c) 2005 by Latchesar Ionkov -Copyright (c) 2011, 2012 Cavium, Inc. -Copyright (c) 2009 Rafael Ignacio Zurita -Copyright (c) 2006, 8D Technologies inc. -Portions Copyright (c) 1993 by Digital Equipment Corporation -Copyright (c) 2005 The OpenSSL Project. All rights reserved -Copyright (c) 1999 Silicon Graphics, Inc. Jeffrey Newquist, newquist@engr.sgi.som -Copyright (c) 2001, 2002, 2003 Peter Dimov -Copyright (c) 2006-2013 Free Software Foundation, Inc. -Copyright (c) 2002 Mark D. Studebaker -Copyright (c) 2010 Daniel Mack -Copyright (c) 2008 Nokia Corporation Kalle Jokiniemi -Copyright (c) 1998-2004 Hewlett-Packard Co David Mosberger-Tang Stephane Eranian -Copyright (c) 1991, 1996 Free Software Foundation, Inc. -Copyright (c) 2004-2008, 2010, Sara Golemon -Copyright (c) 1992, 1995, 1996, 1997, 1999, 2000, 2004 Free Software Foundation, Inc. -Copyright (c) 1991-2003,2006,2009 Free Software Foundation, Inc. -Copyright 2013 Jeff Layton -Copyright (c) 2007-2013 Nicira, Inc. -Copyright (c) 1991, 1996, 1997 Free Software Foundation, Inc. -Copyright (c) 1996-2000 Jonathan A. Buzzard (jonathan@buzzard.org.uk) -Copyright (c) ST Ericsson SA 2011 -Copyright (c) 2010 Texas Instruments Inc -Copyright 1999-2002 Paul Mackerras -Copyright (c) 2002-2003 David McCullough -Copyright (c) 2007-2009 Voltaire, Inc. All rights reserved -Copyright (c) 2008, Simon Josefsson -Copyright (c) 2001 Greg Banks -Copyright (c) 2003, 2005, 2008-2011 Free Software Foundation, Inc. -Copyright (c) 2003, 2007 Free Software Foundation, Inc. -Copyright (c) 2007-2008 Intel Corporation. All rights reserved -(c) 2008 mGine Co.,LTD -Copyright (c) 2012 Samsung Electronics Co., Ltd http://www.samsung.com -Copyright 2019 Huawei Technologies Co.,Ltd. -Copyright (c) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -Copyright (c) 2011 Bosch Sensortec GmbH -Copyright Patrick Powell 1995 -Copyright 2005 MontaVista Software, Inc. Matt Porter -Copyright (c) 1999-2000 Takashi Iwai -Copyright (c) 1997, 1998, 1999, 2006, 2007, 2009 Free Software Foundation, Inc. -Copyright (c) 2000,2005 The OpenSSL Project. All rights reserved -Copyright (c) 2005, 2016 Free Software Foundation, Inc. -Copyright (c) 2003-2008, Philipp Reisner -Copyright (c) 2006 Red Hat, Inc. All rights reserved -(c) 2008 unsik Kim -Copyright 2009 Texas Instruments -Copyright (c) 2004 Dominik Brodowski -Copyright (c) 2001 Jan-Benedict Glaw -Copyright (c) 1999 Xi Graphics, Inc. -Copyright 1996-1999 by David Turner, Robert Wilhelm, and Werner Lemberg -Copyright (c) 2014, Steve Holme, -Copyright (c) 1998 - 2001 Mike D. Schiffman All rights reserved -Copyright (c) 2008 Hewlett-Packard Development Company, L.P. Bjorn Helgaas -Copyright (c) 2000 Marcus Metzler Ralph Metzler Holger Waechtler -Copyright (c) 1995-1997,2000,2001,2003,2008 Free Software Foundation, Inc. -Copyright (c) 1991-1997, 2001, 2003, 2006 Free Software Foundation, Inc. -Copyright (c) 2009-2017 Free Software Foundation, Inc. -Copyright (c) 2002 RidgeRun, Inc. -Copyright (c) 1990, 1991, 1993 Free Software Foundation, Inc. -Copyright 2007, 2008 Vernier Software & Technology Beaverton, OR, USA -Copyright 1997 by Henner Eisen -Copyright (c) 2014, Vijay Panghal, -Copyright (c) 2004 Randy Dunlap -Copyright (c) 2006 Advanced Micro Devices, Inc. -(c) 2012 Michel Lespinasse -Copyright (c) 2007-2009 The Khronos Group Inc. -Copyright (c) 2010 Simon Josefsson -Copyright 2007-2008 OpenedHand Ltd. -Copyright (c) 1998-2005,2007 Free Software Foundation, Inc. -Copyright (c) 2004-2006, Sara Golemon -Copyright 2002 Phil Karn, KA9Q -Copyright (c) 2006,2007 The OpenSSL Project. All rights reserved -Copyright (c) 2000-2002, 2005-2006, 2008-2009, 2011 Free Software Foundation, Inc. -Copyright 2012, Fabio Baltieri -Copyright (c) 2005 Free Software Foundation, Inc. -Copyright 1998-2004 H. Peter Anvin All Rights Reserved -Copyright (c) 1999 Free Software Foundation, Inc. -Copyright (c) 1994-2002 Linus Torvalds -Copyright (c) 2002, 2005-2006, 2009-2017 Free Software Foundation, Inc. -Copyright 2002, Emiliano Martin emilianomc@terra.es All rights reserved -Copyright (c) 2008 ARM Limited -Copyright (c) 2012 Hans Verkuil -Copyright (c) 1996, 1997, 2006 Free Software Foundation, Inc. -Copyright (c) 2008 Atheros Communications Inc. -Copyright (c) 2001 Massimo Dal Zotto -Copyright (c) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation -Copyright (c) 2008-2017 Free Software Foundation, Inc. -Copyright (c) David L. Mills 1993 -Copyright (c) Shaohua Li -Copyright 1999 by Werner Cornelius (werner@titro.de) -Copyright 1994,95,96 by Fritz Elfert (fritz@isdn4linux.de) -Copyright (c) 2011 Wolfram Sang, Pengutronix -(c) 1999 Andrea Arcangeli -Copyright (c) 1998-2000 Dag Brattli, All Rights Reserved -Copyright (c) 2008 James Smart, Emulex Corporation -Copyright (c) 2002-2003, Jouni Malinen -Copyright 1995,96 Thinking Objects Software GmbH Wuerzburg -Copyright (c) 1994, 1995, 1996, 1999 Free Software Foundation, Inc. -Copyright (c) 2012 Google Inc. All Rights Reserved -Copyright (c) 1999-2005, 2012, 2016 Free Software Foundation, Inc. -Copyright (c) 2008 by Jaya Kumar -Copyright 2009, John Malmberg -Copyright (c) 2003-2005 Nokia Corporation -Copyright (c) 2011-2012, NVIDIA CORPORATION. All rights reserved -Copyright (c) 2002-2003, 2005-2006, 2009-2017 Free Software Foundation, Inc. -Copyright (c) 2000 Jens Axboe -Portions Copyright (c) 2001 Christoph Hellwig -Copyright (c) 1991,92,93,94,95,96,97,2002 Free Software Foundation, Inc. -Copyright (c) 2005, Keir Fraser -Copyright (c) 2007-2008 MontaVista Software, Inc. -Copyright (c) 2004, 2005 Topspin Communications. All rights reserved -Copyright (c) 1998, 2001, 2003-2006, 2009-2017 Free Software Foundation -Copyright (c) 2000-2005 by David Brownell -Copyright 1996-1999 by Craig Metz, All Rights Reserved -Copyright (c) 2003-2007 Network Appliance, Inc. All rights reserved -Copyright (c) 1995-2003, 2010 Mark Adler -Copyright (c) 2001 Bjorn Reese -Copyright (c) 2004 IBM Inc. -Copyright (c) 2007 USAGI/WIDE Project, All Rights Reserved -Copyright (c) by Hannu Savolainen 1993-1997 -Copyright (c) 2007 Oracle. All rights reserved -Copyright (c) 1998 Thomas Davis, -Copyright (c) 2013 - 2018, Linus Nielsen Feltzing, -Copyright (c) 1996-2000 Vojtech Pavlik -Copyright (c) 2001-2002, 2004-2017 Free Software Foundation, Inc. -Copyright (c) 2004 IBM Corporation -Copyright (c) 2007-2017 Free Software Foundation, Inc. -Copyright 2002 Hewlett-Packard Company -Copyright (c) 1999-2011 The OpenSSL Project. All rights reserved -Copyright (c) 2010 Herbert Xu -Copyright (c) 1995-1998 Eric Young (eay@cryptsoft.com) All rights reserved -Copyright (c) 2008 Google, Inc. -Copyright (c) 2010 Simon Josefsson -(c) 2008 NetApp. All Rights Reserved -Copyright (c) 2004-2008 by Eric Van Hensbergen -Copyright (c) 2000, 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc. -Copyright (c) 2011 ST-Ericsson SA -Copyright (c) 1995-2003 Jean-loup Gailly and Mark Adler -(c) Copyright 2008 Intel Corporation -Copyright (c) 1985, 1988, 1993 The Regents -Copyright (c) 2009 Imre Kaloz -(c) 2003 Guido Guenther -Copyright (c) Fujitsu, 2012 -Copyright 1996 The Board of Trustees of The Leland Stanford Junior University. All Rights Reserved -Copyright (c) 2002 Neil Brown -Copyright 2008 Michael Wu -Copyright (c) 2011 Nokia Corporation -Copyright (c) 2010, Guennadi Liakhovetski -Copyright 2009-2010 Jonathan Corbet -Copyright (c) 1998, 1999, 2003 Ralf Baechle -Copyright (c) 2003 Silicon Graphics, Inc. All rights reserved -Copyright (c) 2001,2002 Christer Weinigel -Copyright (c) 2013 Dialog Semiconductor -Copyright (c) 2003 Free Software Foundation, Inc. -Copyright (c) 2012 Nokia Corporation -Copyright (c) 2007 Intel Corp. Zhang Yanmin (yanmin.zhang@intel.com) Shaohua Li (shaohua.li@intel.com) -Copyright (c) 2012 Texas Instruments, Inc. -Copyright (c) 2009 Laurent Pinchart -Copyright 2008-2009 Luis R. Rodriguez -Copyright (c) 1992, 1993 The Regents -Copyright (c) 2012 Sven Schnelle -Copyright (c) ST-Ericsson 2010-2012 -Copyright (c) 2011 Bastian Blank -Copyright (c) 2012 Marvell International Ltd. Qiao Zhou -Copyright (c) 2006, Hans J. Koch -Copyright (c) 2007-2012 ST-Ericsson AB -Copyright (c) 2011, RTFM, Inc. -(c) Copyright 2001 Linus Torvalds -Copyright (c) 2009-2010, Lars-Peter Clausen -Copyright (c) 2011 Cambridge Silicon Radio Limited -Copyright (c) 1999 by Michael Engel and Karsten Merker -Copyright (c) 2004-2005 Richard Purdie -Copyright (c) 1997, 1999, 2000, 2001, 2004 Free Software Foundation, Inc. -Copyright (c) 2010 ST Microelectronics Rajeev Kumar -Copyright (c) 2012 Innovative Converged -Copyright (c) 2007 Christian Pellegrin -Copyright (c) 2008-2009 Red Hat, Inc. All rights reserved -Copyright (c) 2012 Samsung Electronics Co.Ltd -Copyright (c) 2016-2018, Daniel Stenberg, -Copyright (c) 1995-1997 Eric Young (eay@cryptsoft.com) All rights reserved -Copyright (c) 2005, 2006, 2007 Free Software Foundation, Inc. -Copyright (c) 1995-1996, 2001-2017 Free Software Foundation, Inc. -Copyright (c) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc. -Copyright (c) 1997, 1998, 2000, 2001, 2002 Free Software Foundation, Inc. -Copyright (c) 2002 Bob Beck -Copyright (c) 2012 - 2017, Daniel Stenberg, -Copyright (c) 2012 Canonical Ltd -Copyright (c) 1999-2004, 2012 Free Software Foundation, Inc. -Copyright (c) 2009-2010 Texas Instruments -Copyright (c) 2010-2017 Christopher Swenson -Copyright (c) 2010-2011 Jeremy Kerr -Copyright (c) 2009 - 2017, Daniel Stenberg, -Copyright 2000, 2006 IBM Corporation -Copyright (c) 2008-2011, Red Hat, Inc., Peter Zijlstra -Copyright 2009-2010 Analog Devices Inc. -Copyright (c) 2004 - 2008 Red Hat, Inc. All rights reserved -Copyright (c) Nokia Corporation -Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler -Copyright (c) 2008-2010 by Daniel Stenberg -Copyright (c) 1997 by Procom Technology, Inc. 2001-2003 by Arnaldo Carvalho de Melo -Copyright (c) 1992 Lawrence Foard -Copyright (c) 2007 The Regents -Copyright (c) 2010 ST-Ericsson SA -Copyright (c) 2003-2006, PathScale, Inc. All rights reserved -Copyright 1993 by OpenVision Technologies, Inc. -Copyright (c) 1996 - 2003, Daniel Stenberg, -Copyright (c) 1998 - 2015, 2017, Daniel Stenberg, -Copyright (c) 2003-2004, Keir Fraser -Copyright (c) 1995-2011, 2016 Mark Adler -Copyright (c) 1999-2007, 2012, 2016 Free Software Foundation, Inc. -Copyright 2009, 2010 Wolfson Microelectronics -Copyright 2007-2008 by Sascha Hlusiak. -Copyright (c) 2004 Infinicon Corporation. All rights reserved -Copyright (c) 2005, Nguyen Anh Quynh -Copyright (c) 2013 The OpenSSL Project. All rights reserved -Copyright (c) 1998 - 2013, Daniel Stenberg, -Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved -Copyright (c) 2007 Jiri Kosina -Copyright (c) 1995-1999, 2000 Free Software Foundation, Inc. -Copyright (c) 1998 by Josh Vanderhoof -Copyright (c) 2007-2010 The Khronos Group Inc. -Copyright (c) 2006 Intel Corp. Tom Long Nguyen (tom.l.nguyen@intel.com) Zhang Yanmin (yanmin.zhang@intel.com) -Copyright 2008 MontaVista Software, Inc. -Copyright (c) 1995-2016 Mark Adler -Copyright (c) 2007 Atmel Corporation -Copyright (c) 1997, 1998-1999 Dag Brattli , All Rights Reserved -Copyright (c) 1991-1995,1997-2006,2007,2009 Free Software Foundation, Inc. -Copyright (c) 1995-2008, 2009 Free Software Foundation, Inc. -(c) Balbir Singh, IBM Corp. 2006 -Copyright (c) 2004, 2005 Free Software Foundation, Inc. -Copyright (c) 1996 Olaf Kirch -Copyright (c) 1998-2004 The OpenSSL Project. All rights reserved -Copyright (c) 1995-2002,2003,2004,2005,2009 Free Software Foundation, Inc. -Copyright 2002 MontaVista Software Inc. -Copyright (c) 2008-2009, Red Hat, Inc., Ingo Molnar -Copyright (c) 1998-2003,2005 Free Software Foundation, Inc. -Copyright (c) 2009, 2010, 2011 Cypress Semiconductor, Inc. -(c) UCB 1986-1988 -Copyright (c) 2004 Szabolcs Gyurko -Copyright (c) 2007-2009 Jiri Kosina -Copyright 2011 Analog Devices Inc. -(c) 1993 by Hartmut Schirmer -Copyright (c) 2012 VMware, Inc. All rights reserved -Copyright (c) 1995-1997, 1999, 2007, 2009 Free Software Foundation, Inc. -Copyright (c) 2000 Dug Song . All rights reserved -Copyright (c) 1999-2000 Vojtech Pavlik -Copyright (c) 2003 Deep Blue Solutions Ltd, All Rights Reserved -Copyright (c) 2001,2002,2004,2006,2007,2009 Free Software Foundation, Inc. -Copyright 2011 Solarflare Communications Inc. -Copyright (c) 2005,2006 Mikhail Gusarov -(c) 2007 SGI, Christoph Lameter -Copyright (c) 2009 VMware, Inc., Palo Alto, CA., USA All Rights Reserved -Copyright 1997 by Carsten Paeth (calle@calle.in-berlin.de) -Copyright (c) 2005, 2012 Free Software Foundation, Inc. -Copyright (c) 2003 BULL SA -Copyright (c) 1998-1999 Dag Brattli, All Rights Reserved -Copyright (c) 2011 Yu Ke -Copyright (c) 2004, 2005, 2012 Mark Adler, all rights reserved -Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008 Free Software Foundation, Inc. -Copyright (c) 2002 Trond Myklebust -Copyright (c) 2010 Samsung Electronics Co. Ltd. Jaswinder Singh -Copyright (c) 1998, 1999, 2017 Kungliga Tekniska HYe -Copyright (c) 2011, 2016 Mark Adler -Copyright 2012 Texas Instruments Inc. -Copyright (c) 1999-2004, 2008, 2016 Free Software Foundation, Inc. -Copyright (c) 2000 by Takashi Iwai , Jaroslav Kysela -Copyright (c) 2007-2009 Michal Simek -Copyright (c) 2001 Ralph Metzler & Marcus Metzler -Copyright (c) 1995-1999, 2000, 2003 Free Software Foundation, Inc. -Copyright 2008 Simtec Electronics http://armlinux.simtec.co.uk Ben Dooks -Copyright (c) 2011-2012 CERN (www.cern.ch) -Copyright (c) 1998-2004,2005 Free Software Foundation, Inc. -Copyright (c) 2005,2006 Mikhail Gusarov -Copyright (c) 2000 Deep Blue Solutions Ltd. -Copyright (c) 2005, 2012 Mark Adler -Copyright (c) 2002 Intel Corp. -Copyright 1999-2000 Jeremy Fitzhardinge -Copyright (c) 2012 Thomas Petazzoni -Copyright (c) 2006 Nokia Corporation -Copyright (c) 2010 CompuLab Ltd. -Copyright (c) 1999-2000 Takashi Iwai -Copyright (c) 1998, 1999, 2000, 2001, 2002 Free Software Foundation -(c) 2002 David Woodhouse -Copyright (c) 1995, 1996 Olaf Kirch -Copyright 1999 Paul Mackerras -Copyright (c) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. -Copyright 2010 Canonical, Ltd. -Copyright (c) 2007, 2008 Siemens AG -Copyright (c) 2009 Marvell International Ltd. Haojian Zhuang -Copyright (c) 1984, Sun Microsystems, Inc. -Copyright (c) 2007 Steven G. Johnson -Copyright (c) 2010 Canonical Ltd. -Copyright (c) 1999-2000 Dag Brattli, All Rights Reserved -Copyright (c) 2009 NXP Semiconductors -Copyright (c) 2006 SWAPP Andrea Paterniani -Copyright 2007 Red Hat, Inc. -Copyright (c) 2005-2006 Cryptocom LTD -Copyright (c) 2006 Simtec Electronics http://armlinux.simtec.co.uk Ben Dooks -Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved -Copyright (c) 2005, Google Inc. All rights reserved -Copyright (c) 2005-2006 Intel Corporation Inaky Perez-Gonzalez -Copyright (c) 2002 Maxim Krasnyansky -Copyright (c) 2012 Samsung Electrnoics Chiwoong Byun -Copyright (c) 1998-2003,2007 Free Software Foundation, Inc. -Copyright (c) 2003, 2017 Simtec Electronics -Copyright (c) 2002,2003 Intel Corp. Jun Nakajima Suresh Siddha -Copyright (c) 2004-2008 Red Hat, Inc. All rights reserved -Copyright (c) 2009-2013 Free Software Foundation, Inc. -Copyright (c) 2011 Jonathan Cameron -Copyright (c) 1996-1999 Silicon Graphics Computer Systems, Inc. -Copyright (c) 1999 - 2004 Intel Corporation. All rights reserved -Copyright (c) 2009-2015 by Daniel Stenberg -Copyright (c) 2007, 2008, 2009 Siemens AG -Copyright (c) 1988 Stephen Deering -Copyright (c) 2007, 2008 Wolfson Microelectronics -Copyright (c) 2009-2012 Siemens AG -Copyright (c) ST-Ericsson AB 2010 -Copyright (c) 2011 Konrad Rzeszutek Wilk -Copyright (c) ST-Ericsson AB 2012 -(c) 2002 Andreas Gruenbacher, -Copyright (c) 2004-2006 Red Hat, Inc., Ingo Molnar -Copyright (c) 1998 Dag Brattli, All Rights Reserved -Copyright (c) 2004, 2005, 2006, 2007 Free Software Foundation, Inc. -Copyright (c) 2009 James Smart, Emulex Corporation -Copyright (c) 1995,1996,1997,1999,2002 Free Software Foundation, Inc. -Copyright (c) 1996-2004, 2006, 2008, 2009 Free Software Foundation, Inc. -Copyright 2005-2018 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2005 Topspin Communications. All rights reserved -Copyright (c) 2007 Eli Fant -Copyright (c) 2004, 2007 Free Software Foundation, Inc. -Copyright (c) 1991, 1992, 1994-2001, 2004, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. -Copyright (c) 1987-1999 Carnegie Mellon University -Copyright (c) 2018 - 2020, Daniel Stenberg, -(c) Copyright 2005 Ian Molton -Copyright (c) 2001, 2016 Free Software Foundation, Inc. -Copyright (c) 2010, 2011, Hoi-Ho Chan, -Copyright (c) 1991,1992,1995-2001,2003,2004 Free Software Foundation, Inc. -Copyright (c) 2012 ST Ericsson Corporation -Copyright (c) 2012 Cirrus Logic Inc. -Copyright (c) 2001, 2002, 2004 Free Software Foundation, Inc. -Copyright (c) 1999, 2000, 2001 by Michael Engel , Karsten Merker -Copyright (c) 2014 Don Zickus -Copyright (c) 1997, 1998, 1999 Free Software Foundation, Inc. -Copyright (c) 2011 Texas Instruments Incorporated - http://www.ti.com All rights reserved -Copyright (c) 1995-2000 Simon G. Vogl -(c) COPYRIGHT International Business Machines Corp. 2001 -Copyright 2004-2009 Simtec Electronics Ben Dooks -Copyright (c) 2004, 2010 Nokia Corporation -Copyright (c) 2011 The OpenSSL Project. All rights reserved -Copyright (c) 2010 Gyungoh Yoo -Copyright (c) 1997 Eddie C. Dost (ecd@skynet.be) -Copyright (c) 2002, 2006, 2009-2017 Free Software Foundation, Inc. -Copyright (c) 2008 Renesas Solutions Corp. -Copyright (c) 1998 - 2010, Florin Petriuc, -Copyright (c) 1997, 1999, 2000 Free Software Foundation, Inc. -Copyright (c) 2001-2002 Silicon Graphics, Inc. All Rights Reserved -Copyright (c) 1999 Al Smith -Copyright (c) 2012, Analog Devices Inc. -Copyright (c) 2013 Broadcom Corporation -Copyright 1993 by Theodore Ts'o -Copyright (c) 2013 Dmitry Kasatkin -Copyright (c) 1993 The Regents -(c) 2010-2011 Thomas Graf -Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved -Copyright 2001 Compaq Computer Corporation -Copyright (c) 2011 secunet Security Networks AG -Copyright (c) 2010 Google Inc. -Copyright (c) 2010-2013 Free Software Foundation, Inc. -Copyright (c) 1994-2003 by Jaroslav Kysela , Abramo Bagnara -Copyright (c) 2007-2008 Even Rouault -Copyright (c) by Jaroslav Kysela , Hannu Savolainen 1993-1996 -Copyright (c) by Jaroslav Kysela , Takashi Iwai -Copyright 2002 Momentum Computer, Inc. -Copyright (c) 2008 Intel Corporation. All rights reserved -Copyright (c) 1997 Dag Brattli , All Rights Reserved -Copyright (c) 2010, Intel Corporation -Copyright (c) 1986 by Sun Microsystems, Inc. -Copyright (c) 1998 R.E.Wolff@BitWizard.nl -Copyright (c) ST-Ericsson SA 2012 -Copyright (c) ST-Ericsson SA 2010 -Copyright (c) 1995-2016 Jean-loup Gailly, Mark Adler -Copyright (c) ST-Ericsson SA 2011 -Copyright (c) 1999-2003, 2005-2006, 2008-2011 Free Software Foundation, Inc. -Copyright (c) 1988-1992 Sun Microsystems Inc All Rights Reserved -Copyright (c) 1998, 1999, 2000, 2004 Free Software Foundation, Inc. -Copyright (c) 2007 by Latchesar Ionkov -Copyright (c) 1997-2013 Free Software Foundation, Inc. -Copyright 2012 Texas Instruments -Copyright (c) 2013 ST-Ericsson AB -Copyright (c) 1995-2013 Free Software Foundation, Inc. -Copyright (c) 1996,1997,1999,2001-2004,2007 Free Software Foundation, Inc. -Copyright (c) 2011 Google, Inc. -Copyright (c) 2006 Simtec Electronics Ben Dooks Vincent Sanders -Copyright (c) 1996-2000,2003,2004,2007 Free Software Foundation, Inc. -Copyright (c) 2007 Davide Libenzi -Copyright (c) 2008 Wolfgang Grandegger -Copyright (c) 2005 Ivan Kokshaysky -Copyright 2010 Wolfram Sang -Copyright (c) 2002-2003 Patrick Mochel -Copyright (c) 2011-2012 Kathleen Nichols -Copyright (c) 1997, 1999, 2003 Free Software Foundation, Inc. -Copyright (c) 2011, Texas Instruments, Inc. -Copyright (c) 2010 OMICRON electronics GmbH -Copyright (c) 1997-1999, 2000-2002, 2007 Free Software Foundation, Inc. -Copyright (c) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler -Copyright (c) 1991, 92, 93, 95, 96, 97, 98 Free Software Foundation, Inc. -Copyright (c) 2004, Richard Levitte -Copyright (c) 2004 Greg Kroah-Hartman -Copyright (c) 1995 2003 Geert Uytterhoeven -Copyright (c) by Paul Barton-Davis -Copyright (c) 1991-2007, 2009 Free Software Foundation, Inc. -Copyright (c) 2003-2006 USAGI/WIDE Project -Copyright 2007 Dension Audio Systems Ltd. -Copyright (c) 1998-2010 Gilles Vollant (minizip) http://www.winimage.com/zLibDll/minizip.html -Copyright (c) 1997, Eric Young -Copyright (c) 1993,1995,1996,1997,1998,2000,2001,2002 Free Software Foundation, Inc. -Copyright (c) 2004, 2010 Mark Adler -Copyright (c) 2011-2012 Linaro Ltd -(c) 2005 Thomas Gleixner -Copyright (c) 2000,2001 Ghozlane Toumi -Copyright 2009 Analog Devices Inc. -Copyright (c) 2006, Keir Fraser -Copyright (c) 2010-11 Texas Instruments Incorporated - http://www.ti.com -Copyright (c) 2010 Daniel Stenberg -Copyright (c) 2003-2006, 2008-2017 Free Software Foundation, Inc. -Copyright (c) 1991,92,94,96,97,99,2002 Free Software Foundation, Inc. -Copyright (c) 1999-2003 The OpenSSL Project. All rights reserved -Copyright 2011-2012 Maxim Integrated -Copyright (c) 2008, 2009 Simon Josefsson -Copyright (c) 2001 Jens Axboe -Copyright (c) 2001-2007 Miklos Szeredi. All rights reserved -Copyright (c) 2007 Dmitry Baryshkov -Copyright (c) 2001 by Andreas Gruenbacher -Copyright (c) 2014 The OpenSSL Project. All rights reserved -Copyright (c) 1991-1993 The Regents -Copyright (c) 2010 Broadcom -Copyright 2001 Silicon Metrics Corporation -Copyright (c) 2012-2013 Free Software Foundation, Inc. -Copyright (c) 2005 Luben Tuikov -Copyright (c) 1997 Silicon Graphics Computer Systems, Inc. -Copyright (c) 2008-2009 Texas Instruments Inc -Copyright (c) 2011 Google, Inc. All rights reserved -Copyright (c) 2005, Wind River Systems All rights reserved -Copyright 2011 Google Inc. -Copyright (c) 2013, Linus Nielsen Feltzing -Copyright by Hannu Savolainen 1993-1997 -Copyright 2010 Maxim Integrated -Copyright (c) 2008 Russell King -Copyright (c) 1994, 1996, 1997, 1998, 1999, 2000, 2004, 2005, 2008, 2009 Free Software Foundation, Inc. -Copyright (c) 1999-2001 Motorola, Inc. -Copyright 1994,1995 rubini@linux.it -Copyright (c) 1996,1997,1999-2002,2003 Free Software Foundation, Inc. -Copyright (c) 2002,2004 MARA Systems AB -Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. -Copyright (c) by Jaroslav Kysela , Creative Labs, Inc. Definitions -Copyright 2006-2009 Solarflare Communications Inc. -(c) Copyright 2010 Dirk Eibach, Guntermann & Drunck GmbH -Copyright (c) 2012 Marvell Technology Ltd. Yunfan Zhang -Copyright (c) 2005-2009 Samsung Electronics Kyungmin Park -(c) 2003 Andreas Gruenbacher -Copyright 2000, LifeLine Networks BV (www.lifeline.nl). All rights reserved -Copyright (c) 2000 Stephane Eranian -Copyright 2000 VA Linux Systems, Inc., Fremont, California -Copyright (c) 1997-2007 Jean Tourrilhes -Copyright 2010 (c) Texas Instruments, Inc. http://www.ti.com -Copyright 2001, Glen Scott. All rights reserved -Copyright (c) 2008 Nokia Corporation -Copyright (c) 1999-2003, 2005-2006, 2008 Free Software Foundation, Inc. -Copyright (c) 1991,1992,1995-2002,2007,2009 Free Software Foundation, Inc. -Copyright (c) 2006 Komal Shah -Copyright (c) 1982, 1986, 1990, 1993 The Regents -Copyright (c) 2010 Marco Stornelli -Copyright (c) 2005 Arnaud Patard -Copyright (c) 1993-1998,2000,2002-2004,2008 Free Software Foundation, Inc. -Copyright jfclere@sinix.net -Copyright (c) 2011 James Nuss -Copyright 2008 Openmoko, Inc. -Copyright (c) 2009 VMware, Inc. All Rights Reserved -Copyright (c) 1997, 1998, 1999, 2000, 2001, 2004, 2005, 2006 Free Software Foundation, Inc. -Copyright (c) 2012 Avionic Design GmbH -Copyright (c) 2012 Michael D. Taht -Copyright (c) 1992, 93, 94, 95, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. -(c) 1997 Martin Mares -Copyright (c) 2003, 2005, 2008, 2010, 2012 Mark Adler -Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2011 Samsung Electronics Co.Ltd http://www.samsung.com -Copyright (c) 2013 - 2017, Daniel Stenberg, -Copyright 2006, 2007 Sony Corporation -Copyright (c) Red Hat, Inc., 2009, 2010, 2011 -Copyright (c) 2007 The OpenSSL Project. All rights reserved -Copyright (c) 2010 Rafael J. Wysocki, Novell Inc. -Copyright (c) 2000-2002 Joakim Axelsson Patrick Schaaf Martin Josefsson -Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved -Copyright (c) 2005 Russell King -Copyright (c) 2008 Simtec Electronics http://armlinux.simtec.co.uk Ben Dooks -Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved -Copyright 2004-2005 Red Hat, Inc. Jeff Garzik -Copyright (c) 1998-2017 The OpenSSL Project. All rights reserved -Copyright (c) 2005, Keir Fraser -Copyright (c) 1999-2014 The OpenSSL Project. All rights reserved -Copyright (c) 2002-2005,2008 Mellanox Technologies LTD. All rights reserved -Copyright (c) 2004, 2005, 2009 Free Software Foundation, Inc. -Copyright (c) 2010 Samsung Electronics Co.Ltd -copyright IBM Corp. 2007 -(c) Copyright 2002-2004 by David Brownell All Rights Reserved -Copyright (c) 2012 Texas Instruments Incorporated - http://www.ti.com -Copyright (c) 2006-2007 The -Copyright (c) 1991-1994,1996-2001,2003,2004,2005,2007,2009 Free Software Foundation, Inc. -Copyright (c) 2004-2005, K A Fraser -Copyright (c) 1995,96,97,98,99,2000,2004,2007 Free Software Foundation, Inc. -Copyright (c) 1999 Silicon Graphics, Inc. -Portions Copyright 2002 Intel eli.kupermann@intel.com, christopher.leech@intel.com -(c) 2000 Nicolas Pitre -Copyright (c) 2001-2007 Red Hat, Inc. -Copyright (c) 2002, IBM Corp. -Copyright (c) 2018 Jeroen Ooms -Copyright (c) 1999-2010 The OpenSSL Project. All rights reserved -Copyright (c) 2001 - 2003 Sistina Software (UK) Limited -Copyright (c) 2009 Rafael J. Wysocki -Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved -Copyright 2009-2011 Analog Devices Inc. -Copyright (c) 2003 The OpenSSL Project. All rights reserved -Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved -Copyright 2008 Ian Kent -Copyright (c) 2004, 2005, 2007 Free Software Foundation, Inc. -Copyright (c) 2001-2005 by Thomas Winischhofer, Vienna, Austria -(c) 2003 - 2004 Dominik Brodowski -Copyright (c) 1997, 1998 Free Software Foundation, Inc. -Copyright (c) 2001,...,2006 Davide Libenzi -Copyright 2006 IBM Corporation -Copyright (c) 2012 Benjamin Tissoires -Copyright (c) 2004-2009 Nokia Corporation -Copyright (c) 2000-2004, 2006-2010 Free Software Foundation, Inc. -Copyright (c) 1991-1993,1995-2004,2007,2009 Free Software Foundation, Inc. -Copyright (c) 2011-2013 The OpenSSL Project. All rights reserved -Copyright (c) 2011-2012 Pali Rohar -Copyright (c) 2004 Mellanox Technologies Ltd. All rights reserved -Copyright (c) 2001-2003 Red Hat, Inc. -Copyright (c) 2009 - 2010 Samsung Electronics Co.Ltd -Copyright (c) 2005 Silicon Graphics, Inc. All Rights Reserved -Copyright (c) 2003-2005 David Hollis -Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved -Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 1991-1999,2001,2002,2007,2009 Free Software Foundation, Inc. -Copyright (c) 2012 Free Software Foundation, Inc. -Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc. -Copyright (c) 1999 by Uros Bizjak Takashi Iwai -Copyright (c) 2008-2009 MontaVista Software Inc. -Copyright (c) 1999-2003, 2008 Free Software Foundation, Inc. -Copyright (c) 1999, 2001, 2004, 2009 Free Software Foundation, Inc. -Copyright (c) 1996-2001 Internet Software Consortium -Copyright (c) 2007 Dave Airlie -Copyright (c) 1991,92,96,97,99,2000,2001,2009 Free Software Foundation, Inc. -Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. All Rights Reserved -Copyright (c) 2009, 2010 Simon Josefsson -Copyright (c) 2006 Mellanox Technologies. All rights reserved -Copyright (c) 1999, 2000, 2001, 2004, 2007 Free Software Foundation, Inc. -Copyright (c) 2000-2010 David Woodhouse Steven J. Hill Thomas Gleixner -Copyright (c) 2009 ST Microelectronics Viresh Kumar -(c) CopyRight EdelWeb -Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen -Copyright (c) 2002, 2003 - Tom Zanussi (zanussi@us.ibm.com), IBM Corp -Copyright 2010 Marvell Zhangfei Gao -Copyright (c) 2011, NVIDIA Corporation -Copyright Matthew Wilcox -Copyright (c) 2008 Sujith Thomas -Copyright (c) 1998 - 2022, Daniel Stenberg, -Copyright (c) 2003-2010 David Woodhouse -Copyright (c) 2015 6WIND S.A. -Copyright (c) Amit Shah , 2009, 2010, 2011 -Copyright (c) 2010-2017 Free Software Foundation, Inc. -Copyright (c) 1992 by Theodore Ts'o -Copyright (c) 2008 by Sascha Hauer -Copyright (c) 2001 Peter Bergner, IBM Corp. -Copyright (c) 1990-2000, 2003-2004, 2006-2017 Free Software Foundation, Inc. -Copyright 2008,2010 Anton Vorontsov -Copyright (c) 2012 Thorsten Nowak -Copyright (c) 2012, Anish Kumar -Copyright (c) 2011 Antonio Ospite -Copyright (c) 2007 Free Software Foundation, Inc. -Copyright (c) 2010 Sun Microsystems, Inc. All rights reserved -Copyright (c) 1994-2000, 2003, 2004, 2005 Free Software Foundation, Inc. -Copyright (c) 1998 - 2010, Daniel Stenberg, -Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2011, Intel Corporation -Copyright (c) 2014 Chelsio, Inc. All rights reserved -Copyright (c) 2009 Orex Computed Radiography Baruch Siach -Copyright (c) 2004-2011 Red Hat, Inc. All rights reserved -Copyright (c) 2008 Riku Voipio -Copyright (c) 2009 Alberto Panizzo -Copyright (c) 2017 - 2018 Red Hat, Inc. -Copyright (c) 2009 Free Software Foundation, Inc. -Copyright (c) 2010 Samsung Electronics Co., Ltd. http://www.samsung.com -(c) Jay Lan, SGI, 2006 -Copyright (c) 2008-2011, Red Hat, Inc., Ingo Molnar -Copyright (c) 1994-2000 by Jaroslav Kysela -Copyright (c) 2005,2006 Hongjiu Lu -Copyright (c) 2001 Red Hat UK Limited -Copyright (c) 2006 Luming Yu -Copyright (c) 1998-9 Tim Waugh -Copyright (c) 2008-2009 Marvell Semiconductor -Copyright (c) 1998 by Frank van de Pol -Copyright (c) 2012 Hauke Mehrtens -Copyright 2008 Michael Buesch -Copyright (c) 2010, Baruch Siach -Copyright (c) 1995-99 Simon G. Vogl -Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2004 The OpenSSL Project. All rights reserved -Copyright (c) 2003 Sistina Software Limited -Copyright (c) 2012 Russell King -Copyright (c) 1996 Free Software Foundation, Inc. -Copyright (c) 2013-2015, Daniel Stenberg, -(c) MontaVista Software, Inc. -Copyright (c) 2010 - 2011, Hoi-Ho Chan, -Copyright (c) 2012 Samsung Electronics -Copyright (c) 2005 James Simmons -Copyright (c) 1996, 2000, 2002, 2009 Free Software Foundation, Inc. -Copyright (c) 1991, 92, 96, 97, 98, 99, 2004 Free Software Foundation, Inc. -Copyright (c) 2018 - 2019, Daniel Stenberg, -Copyright (c) 2001-2003 Patrick Mochel -Copyright (c) 2011 Marvell International Ltd. All rights reserved -Copyright (c) 1992,1996,1997,2000,2004,2005 Free Software Foundation, Inc. -Copyright (c) 2004 Red Hat, Inc., James Morris -Copyright (c) 2004-2007 Red Hat, Inc. All rights reserved -Copyright (c) 2015 Red Hat, Inc. -(c) 1995-1998 E.M. Serrat emserrat@geocities.com -Copyright (c) 1996, 1997, 1999 Free Software Foundation, Inc. -Copyright (c) 2011 Samsung Electronics Donggeun Kim -Copyright (c) 2008 IBM Corp., Benjamin Krill -Copyright 2000-2022 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2009 Samsung Electronics Ltd. Jaswinder Singh -Copyright (c) 2001, 2003 Free Software Foundation, Inc. -Copyright (c) 2012 - 2014, Nick Zitzmann, -Copyright (c) 1999-2003 Free Software Foundation, Inc. -Copyright (c) 2010 Texas Instruments -Copyright (c) 1995, 2001-2004, 2006-2017 Free Software Foundation, Inc. -Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -Copyright (c) 2008, Sascha Hauer -Copyright (c) 2011 Unixphere -Copyright (c) 2011 Kionix, Inc. -Copyright (c) 2003 The OpenEvidence Project. All rights reserved -Copyright 2008 Wolfson Microelectronics -Copyright 2010,2011 Intel Corp. -Copyright (c) 2010 Fabien Chouteau -Copyright (c) 2012 Red Hat, Inc. -Copyright (c) 1998, 1999, 2000, 2002 Free Software Foundation, Inc. -Copyright (c) 2005 Pete Zaitcev -Copyright (c) 2008 Cambridge Silicon Radio Ltd. -Copyright (c) 1996,1997,1998,1999,2000,2004 Free Software Foundation, Inc. -Copyright (c) 2007-2008 Michal Simek -Copyright (c) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. -Copyright (c) 2002, 2003, 2004, 2007, 2009 Free Software Foundation, Inc. -Copyright (c) 2010 - 2018, Daniel Stenberg, -Copyright (c) 1999-2001, 2005, 2012, 2016 Free Software Foundation, Inc. -Copyright (c) 1998-2009 The OpenSSL Project. All rights reserved -Copyright (c) 2002 by Ron Minnich -Copyright (c) 2002-2003 Patrick Mochel -Copyright (c) 2001, 2002, 2005, 2007 Free Software Foundation, Inc. -Copyright (c) 1998, 1999, 2001 Hewlett-Packard Co -Copyright (c) 2010 Stefan Achatz -Copyright (c) 2007, 2008 Free Software Foundation, Inc. -Copyright (c) 2002 David S. Miller (davem@redhat.com) -Copyright (c) 2008 Red Hat, Inc. All rights reserved -Copyright (c) 1982, 1986, 1992, 1993 The Regents -Copyright (c) 2000-2003 The OpenSSL Project. All rights reserved -Copyright 2006 Simtec Electronics -Copyright (c) 1991-1994,1996-2003,2005,2006,2009 Free Software Foundation, Inc. -Copyright (c) IBM Corp. 2006 -Copyright (c) 2010 ST Microelectronics Vipin Kumar -Copyright (c) 2009-2011 Wind River Systems, Inc. -Copyright (c) 2001 Romain Dolbeau -Copyright 1998-2000 Red Hat, Inc All Rights Reserved -Copyright 1997 1999 Martin Mares -Copyright (c) 2014, Bill Nagel , Exacq Technologies -Copyright (c) 2011 Samsung Electronics MyungJoo Ham -Copyright 2005, Francis ANDRE. All rights reserved -Copyright (c) 2005 Mellanox Technologies. All rights reserved -Copyright (c) 2006 Thumtronics Pty Ltd. -Copyright (c) 2005-2006, 2009-2017 Free Software Foundation, Inc. -Copyright (c) 1994 Hewlett-Packard Company -Copyright (c) STMicroelectronics 2009 -Copyright 2004-2010 Analog Devices Inc. -Copyright (c) 2007-2010 Advanced Micro Devices, Inc. -Copyright (c) 2009 Wolfram Sang, Pengutronix -Copyright (c) 2008 STMicroelectronics -(c) 2000 James Morris -Copyright (c) 1997-2001, 2004, 2007 Free Software Foundation, Inc. -Copyright (c) 1997, 1998, 1999, 2001, 2002, 2005, 2008 Free Software Foundation, Inc. -Copyright (c) 1999-2009 Free Software Foundation, Inc. -Copyright (c) ST-Ericsson 2013 -Copyright (c) 2004-2009, Sara Golemon -(c) 2004 Simtec Electronics -Copyright (c) 2004-2017 Mark Adler -Copyright (c) 2001 IBM Corp. -Copyright (c) 2004-2007 Sara Golemon -Copyright (c) 2005 Ian McDonald -Copyright (c) 2001 Eric Lavigne -Copyright (c) 2006, Michael Wu -Copyright 2008, 2009 Luis R. Rodriguez -Copyright (c) 2006 Trusted Computer Solutions, Inc. -Copyright (c) 2002 Red Hat, Inc. All Rights Reserved -Copyright (c) 1995-2003 Mark Adler -Copyright (c) 2010, Howard Chu, -Copyright (c) 1998, 1999, 2000, 2002, 2009 Free Software Foundation, Inc. -Copyright (c) 1998-2006,2007 Free Software Foundation, Inc. -Copyright 2010 Florian Tobias Schandinat -Copyright (c) 2007 Sylvain Munaut -Copyright (c) 2010,2011 Code Aurora Forum. All rights reserved -Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. -Copyright (c) 1992-2001, 2002, 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc. -(c) 2002 Rusty Russell IBM -Copyright (c) Dmitry Yusupov, 2004 - 2005 -Copyright 2012 Analog Devices Inc. -Copyright (c) 2011 Intel Corporation. All rights reserved -Copyright (c) 1997,98,99,2000,2001 Free Software Foundation, Inc. -Copyright (c) 1996, 1999, 2001 Free Software Foundation, Inc. -Copyright (c) 2001-2007 Jean Tourrilhes, All Rights Reserved -Copyright (c) 2009-2012 Jason Baron -Copyright (c) 2004, 2007-2017 Free Software Foundation, Inc. -Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved -Copyright 2011 Texas Instruments Inc. -Copyright (c) 1996-2002, 2003, 2006 Free Software Foundation, Inc. -Copyright (c) 2004 Kungliga Tekniska -Copyright (c) 2007 Rodolfo Giometti -Copyright (c) 2007-2011 Intel Corporation. All rights reserved -Copyright (c) 2013 Texas Instruments -Copyright (c) Mike Christie, 2004 - 2006 -Copyright (c) 2001-2004 Peter Osterlund -Copyright (c) 1995-2008 Mark Adler -Copyright (c) 2010 Nokia Corporation. All rights reserved -Copyright (c) 1999-2001, 2007, 2016 Free Software Foundation, Inc. -Copyright (c) 2004-2008 SMSC -Copyright 2010 Yong Shen -Copyright (c) 1998-2000, 2004, 2005, 2007, 2008 Free Software Foundation, Inc. -Copyright (c) 2011 Neil Brown -Copyright (c) 2009 Nobuhiro Iwamatsu -Copyright (c) 2008 Marvell Semiconductor -Copyright (c) 2018 - 2021, Daniel Stenberg, -Copyright (c) 1996-2002, 2003, 2004, 2009 Free Software Foundation, Inc. -Copyright (c) 1996, 1998, 1999 Free Software Foundation, Inc. -Copyright (c) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL. -Copyright (c) 1997-2002, 2003 Free Software Foundation, Inc. -Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved -Copyright (c) 2010, NVIDIA Corporation -Copyright (c) 1991,1992,1994-2001,2003,2004,2005,2006,2007, 2009 Free Software Foundation, Inc. -Copyright (c) 2002-2013 Mark Adler -Copyright (c) 2005 Yani Ioannou -Copyright (c) 2014 Seth Jennings -Copyright 2010-2016 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2009 System Fabric Works, Inc. All rights reserved -Copyright (c) 2007 Xiantao Zhang -Copyright (c) 2012 - 2016, Daniel Stenberg, -Copyright (c) 1995-1997 Eric Young (eay@cryptsoft.com) -Copyright (c) 1998, Dag Brattli All Rights Reserved -Copyright (c) 2005 Dirk Opfer -Copyright (c) 1998 - 2007, Daniel Stenberg, -Copyright (c) 2011 Texas Instruments -Copyright (c) 2004 - 2006 Mike Christie -Copyright (c) 1996 Paul Mackerras -Copyright (c) 2003-2006 Helsinki University of Technology -Copyright (c) 2002-2006, K Fraser -Copyright (c) 1999-2001 Free Software Foundation, Inc. -Copyright (c) 2011 Rafael J. Wysocki , Renesas Electronics Corp. -Copyright (c) 1998-2007,2008 Free Software Foundation, Inc. -Copyright (c) 2009 ST-Ericsson -Copyright (c) 1999 Hewlett-Packard Co. -Copyright (c) 2005 John Lenz -Copyright (c) 2008 Guennadi Liakhovetski, DENX Software Engineering, -Copyright (c) 2007-2009 PetaLogix -Copyright (c) 2002-2006 The OpenSSL Project. All rights reserved -Copyright (c) 2001, 2003-2004, 2007, 2009-2017 Free Software Foundation, Inc. -Copyright (c) 2004-2006 Atmel Corporation -Copyright (c) 1999-2001, 2008, 2016 Free Software Foundation, Inc. -Copyright (c) 2009-2017 Dave Gamble and cJSON contributors -Copyright (c) 2004 - 2005 Red Hat, Inc. All rights reserved -Copyright (c) 1990 Sun Microsystems -Copyright (c) 2010 Texas Instruments Incorporated - http://www.ti.com -Copyright (c) 2004 by Internet Systems Consortium, Inc. -Copyright (c) 2011 National Semiconductor -Copyright (c) 2004-2009 Greg Kroah-Hartman -Copyright 2017 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2005-2007, Wind River Systems All rights reserved -Copyright (c) 2001, 2003-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (c) 2004-2010 David Woodhouse -Copyright (c) 2008, Guennadi Liakhovetski -Copyright 2000, Marc Welz -Copyright (c) 2001-2003 Hewlett-Packard Co Stephane Eranian -Copyright (c) 2012 Heiko Stuebner -Copyright 2004 Felix Kuehling All Rights Reserved -Copyright (c) 1996, 1997, 1998, 1999, 2004, 2008 Free Software Foundation, Inc. -Copyright (c) 2012 Ecole Nationale de l'Aviation Civile, France -Copyright (c) 1998-99 Frodo Looijaard -Copyright 2007 IBM, Inc. -Copyright (c) 2010, 2011 Ericsson AB. -Copyright (c) 2001 Sven Luther, -Copyright (c) 2005-2008 Pierre Ossman, All Rights Reserved -Copyright (c) 2004-2007, Sara Golemon -Copyright (c) 2009 Antonio Ospite -Copyright (c) Shailabh Nagar, IBM Corp. 2006 -Copyright (c) 1998 - 2011, 2017, Daniel Stenberg, -Copyright (c) 1995, 1996, 1997 Olaf Kirch -Copyright (c) 2002 by Takashi Iwai -Copyright (c) 2012 Samsung Electronics Co., Ltd. http://www.samsung.com -Copyright (c) 1996-2005 Paul Mackerras -Copyright (c) 2001-2002 The OpenSSL Project. All rights reserved -(c) Copyright Hewlett-Packard Development Company -Copyright (c) 2008-2009 PetaLogix -Copyright (c) 1992,1996-1999,2003,2004 Free Software Foundation, Inc. -Copyright (c) 1999-2002, 2006, 2016 Free Software Foundation, Inc. -Copyright (c) 1998-2005 Gilles Vollant -Copyright 1994-1998 Paul Mackerras -Copyright 2008 Michael Buesch -Copyright (c) 2012 Texas Instruments -Copyright (c) 1996-2003, 2005, 2007 Free Software Foundation, Inc. -Copyright (c) 1999-2002, 2005, 2016 Free Software Foundation, Inc. -Copyright (c) 2012 NVIDIA Corporation -Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved -Copyright (c) 2006 Intel Corporation Inaky Perez-Gonzalez -Copyright (c) 2007 Google, Inc. -(c) 1999 David A. Hinds -Copyright (c) 1990, 1998, 2000-2001, 2003-2006, 2009-2017 Free Software -Copyright 2008 Embedded Alley Solutions, Inc. -Copyright (c) 2013 Freescale Semiconductor, Inc. -Copyright (c) 2001, 2004, 2005 Free Software Foundation, Inc. -Copyright (c) 2003 Eric J Bohm -Copyright (c) 2009 by Daiki Ueno -Copyright (c) 2002 Nico Schottelius -Copyright (c) 2012 - 2014, Linus Nielsen Feltzing, -Copyright (c) 1999-2001 Bruno Haible -Copyright (c) 2007 SUSE Linux Products GmbH -Copyright (c) 2009 MontaVista Software, Inc. -Copyright (c) 2013-2015, Mellanox Technologies, Ltd. All rights reserved -Copyright (c) 2006 STMicroelectronics Pvt. Ltd. -Copyright 1997 by Carsten Paeth -Copyright (c) 2014, Google Inc. -Copyright (c) 1995 by Paal-Kr. Engstad and Volker Lendecke -Copyright (c) 1999-2007, 2016 Free Software Foundation, Inc. -Copyright 2004,2012 Freescale Semiconductor, Inc -Copyright 2005 Simtec Electronics Ben Dooks -Copyright (c) 2004 Intel Corporation. All rights reserved -(c) 2007 Venkatesh Pallipadi Shaohua Li Adam Belay -Copyright (c) 2005 Stuart Brady -Copyright (c) 2004 Dmitry Torokhov -Copyright (c) 1995, 1999, 2001-2007 Free Software Foundation, Inc. -Copyright (c) 2009 Gabor Juhos -Copyright (c) 1998 - 2014, Daniel Stenberg, -Copyright (c) 2002, 2003 Free Software Foundation, Inc. -Copyright 1998 Franco Venturi -Copyright (c) 2001-2004 Silicon Graphics, Inc. All rights reserved -Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -(c) Copyright IBM Corp. 2007 -Copyright (c) 2004, 2008, 2012, 2016 Mark Adler, all rights reserved -Copyright (c) 2008 Nuvoton technology corporation All rights reserved -Copyright (c) 1994,1996-2001,2004,2005,2006 Free Software Foundation, Inc. -(c) 2006-2008 by Openmoko, Inc. All rights reserved -Copyright 2013-2014 Intel Mobile Communications GmbH -Copyright (c) 2012 Javier Martinez Canillas -Copyright 2005 Eric Anholt All Rights Reserved -Copyright (c) 1995-2003 by Jean-loup Gailly -Copyright (c) 2009 Texas Instruments, Inc. -Copyright (c) 2009 Marek Vasut -(c) Copyright IBM Corp. 2005 -Copyright (c) 2006, 2007 Cisco Systems, Inc. All rights reserved -(c) 2002 Harald Welte -Copyright (c) 2014 - 2017, Steve Holme, -Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2009 RidgeRun (todd.fischer@ridgerun.com) -Copyright (c) 1997-1998, 2006-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (c) 2008-2009, Thomas Gleixner -Copyright (c) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. -Copyright 2003 Simtec Electronics (linux@simtec.co.uk) -Copyright (c) 2005-2006 Chris Humbert -Copyright 2000,2001,2002 Red Hat, Inc. -Copyright (c) 1998-2010 Gilles Vollant -Copyright 2007 Wolfson Microelectronics PLC -Copyright IBM Corp. 2001,2006 -Copyright (c) 2006 Texas Instruments -(c) Copyright IBM Corp. 2013 -Copyright (c) 2017 - 2018, Yiming Jing, -Copyright (c) 2009-2013 Realtek Semiconductor Corp. All rights reserved -Copyright 2012 Jean-Christophe PLAGNIOL-VILLARD -Copyright (c) 2012 Bjorn Mork -(c) 2003 - 2008 Dominik Brodowski -Copyright (c) 1999-2015 The OpenSSL Project. All rights reserved -Copyright (c) 2005 Guillaume Thouvenin -Copyright 2010 Wolfson Microelectronics -Copyright 1999, Mark Martinec. All rights reserved -Copyright (c) 2005 Dmitry Yusupov -Copyright (c) 2010 The OpenSSL Project. All rights reserved -Copyright 2002 Rusty Russell IBM Corporation -Copyright (c) 1999 Steve Ratcliffe -Copyright (c) 2000 Red Hat UK Limited -Copyright (c) 1996,1997,1998,1999,2000,2002,2006,2009 Free Software Foundation, Inc. -Copyright (c) 2003, 2012 Mark Adler, all rights reserved -Copyright (c) 2001 Intel Corp. -Copyright 2003 H. Peter Anvin -Copyright (c) 2005 Chuck Lever -Copyright (c) 2007-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA -Copyright (c) 2017-2019, Daniel Stenberg, -Copyright (c) 2005-2010 Intel Corporation. All rights reserved -Copyright (c) 2007 Google Incorporated -Copyright (c) 1999 David A. Hinds. All Rights Reserved -Copyright (c) 2006 by Jing Min Zhao -Copyright (c) 2009 Andres Salomon -Copyright 2003-2005 Jeff Garzik -Copyright EMC Corporation, 2008 -Copyright (c) 2001 Silicon Graphics, Inc. Trust Technology -Copyright (c) 2007 Red Hat, Inc. All Rights Reserved -Copyright (c) 2011 - 2015, Daniel Stenberg, -Copyright (c) 2008 The OpenSSL Project. All rights reserved -Copyright (c) 2010 Red Hat Inc. -(c) 1998-1999 by Jaroslav Kysela -Copyright 1998-2009 VIA Technologies, Inc. All Rights Reserved -Copyright (c) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. -Copyright (c) 2008 Oracle. All rights reserved -Copyright (c) 2012, Intel Corporation -Copyright (c) 1997 by Procom Technology,Inc. 2001-2003 by Arnaldo Carvalho de Melo -Copyright 2008-2016 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2011 Imagination Technologies -Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. -Copyright 2008 Red Hat, Inc. All rights reserved -Copyright (c) 2001 David Howells (dhowells@redhat.com) -Copyright (c) 1995-2005 Jean-loup Gailly and Mark Adler -Copyright (c) 2008 by Eric Van Hensbergen -Copyright (c) 1999 Tigran Aivazian -Copyright by Werner Cornelius (werner@titro.de) -Copyright (c) 2012 Savoir-faire Linux Inc. Vivien Didelot -Copyright (c) 2010 Alexander Sverdlin -Copyright by Michal Miroslaw, 2008-2009 -Copyright (c) 2002 Robert Kaiser -Copyright (c) 2004 by Eric Van Hensbergen -Copyright (c) 1995, 1996, Olaf Kirch -Copyright (c) 2011 Red Hat, Inc. All rights reserved -Copyright (c) 2015, Daniel Stenberg, -Copyright (c) 2012 Alexander Shiyan -Copyright (c) 2008 IBM Corporation -Copyright (c) 1994, 1997, 1998, 1999, 2009 Free Software Foundation, Inc. -Copyright (c) 1998 - 2019, Daniel Stenberg, -Copyright (c) 1996,1997 Silicon Graphics Computer Systems, Inc. -Copyright 2000 Precision Insight, Inc., Cedar Park, Texas -Copyright (c) 2012 Paul Parsons -Copyright (c) 2006 Cisco Systems, Inc. All rights reserved -Copyright (c) 2000 Andrew Tridgell -Copyright (c) 1997, 1998, 1999, 2000, 2003 Free Software Foundation, Inc. -Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved -Copyright (c) 2009 Nokia Corporation Roger Quadros -Copyright (c) 1990-2000 Info-ZIP. All rights reserved -Copyright (c) 1995-1997, 2003, 2006, 2008-2017 Free Software Foundation -Copyright (c) 2003 Winfried Ritsch (IEM) -Copyright (c) 2009 STMicroelectronics Ltd -Copyright (c) 2011-2014, Intel Corporation -Copyright (c) 1997, 2002 Free Software Foundation, Inc. -(c) MontaVista Software, Inc. Daniel Walker -Copyright (c) 2001, 2005, 2016 Free Software Foundation, Inc. -Copyright (c) 1996, 1997, 1998, 1999, 2004 Free Software Foundation, Inc. -Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved -Copyright 2001 Jeff Garzik -(c) Copyright 2007, 2009 Tiago Vignatti -Copyright (c) 1999 by Takashi Iwai -Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation -Copyright (c) 2001 Networks Associates Technology, Inc -Copyright (c) 1996-98 Ingo Molnar, Gadi Oxman -Copyright (c) 2002, 2007 Free Software Foundation, Inc. -Copyright (c) 2005-2006 Network Appliance, Inc. All rights reserved -Copyright (c) 1999-2003, 2005, 2007, 2010, 2012 Free Software Foundation, Inc. -Copyright 2002-2019 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2002 Shane Nay (shane@minirl.com) -Copyright (c) 2000-2007 Silicon Graphics, Inc. All Rights Reserved -Copyright (c) 1999 Hewlett-Packard Co -Copyright (c) 2000 The Regents -Copyright (c) 2013 Philipp Zabel, Pengutronix -Copyright 2007, 2008 Wolfson Microelectronics PLC -Copyright (c) 1999-2001, 2012, 2016 Free Software Foundation, Inc. -Copyright (c) 2010 Ira W. Snyder -Copyright (c) 2004-2007 Red Hat, Inc. All Rights Reserved -Copyright 2009, 2010, Nick Piggin, Novell Inc. -Copyright (c) 1997 - 2017, Daniel Stenberg, -Copyright (c) 2005 Oracle. All rights reserved -Copyright (c) 1996 by Internet Software Consortium -Copyright (c) 2005, 2006 Cisco Systems, Inc. All rights reserved -Copyright (c) 2008-2014 Patrick McHardy -Copyright 2010 Analog Devices Inc. -Copyright 1999-2023 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2008-2014 by Daniel Stenberg -Copyright (c) 1995 - 1997 Marco van Wieringen -Copyright (c) 1998 Kenneth Albanowski The Silver Hammer Group, Ltd. -Copyright (c) 1998, 1999 Free Software Foundation, Inc. -Copyright (c) 2002 Johann Deneux -Copyright (c) 2005 Red Hat, Inc., James Morris -Copyright (c) 1998, 1999, 2000, 2002, 2003 Free Software Foundation, Inc. -Copyright (c) 2004, EdelKey Project. All Rights Reserved -Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation -Copyright (c) 2013 Texas Instruments Incorporated - http://www.ti.com -Copyright (c) 2009 Guiming Zhuo -Copyright (c) 1999 Precision Insight, Inc. -Copyright (c) 2006 Simtec Electronics Ben Dooks -Copyright (c) 2003, 2006-2007, 2009-2017 Free Software Foundation, Inc. -Copyright 2006, 2007, 2008 Johannes Berg -(c) 2002 - 2003 Dominik Brodowski -Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved -Copyright (c) 2006-2008 David Brownell -Copyright (c) 2001,2002 Patrick Mochel -(c) 1998 Gerd Knorr -Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved -copyright (c) 1992 Michael K. Johnson Interrupt -Copyright (c) 2009-2012 ST Microelectronics Viresh Kumar -Copyright (c) 2005, Devicescape Software, Inc. -Copyright (c) 1991, 92, 1996-1999, 2001, 2003 Free Software Foundation, Inc. -Copyright (c) 2008,2009 System Fabric Works, Inc. All rights reserved -Copyright (c) 1991, 1992, 1996, 1997, 1998, 1999, 2000, 2005 Free Software Foundation, Inc. -Copyright (c) 2010 Red Hat -Copyright (c) 1999-2006, 2012, 2016 Free Software Foundation, Inc. -Copyright (c) 2012 Roland Stigge -Copyright (c) 2015, Steve Holme, -Copyright (c) 2005-2009 Rodolfo Giometti -Copyright (c) 1999-2000 Takashi iwai -Copyright (c) 2002 by Concurrent Computer Corporation -Copyright (c) IBM Corp. 2006 Character -Copyright (c) 2002-2003 Open Source Development Labs -(c) 2001 Marc Boucher (marc@mbsi.ca) -Copyright (c) 2007 KISA(Korea Information Security Agency). All rights reserved -Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2002,2003 Jun Nakajima -(c) 1998 Rusty Russell -Copyright (c) 1991-1993, 1995-1999, 2001, 2002, 2004, 2006, 2009 Free Software Foundation, Inc. -Copyright (c) 2014 Red Hat, Inc. All Rights Reserved -Copyright (c) 1998 - 2012, 2017, Daniel Stenberg, -Copyright Motorola 1984 -Copyright (c) 1995,1996,1997,1998,1999,2003 Free Software Foundation, Inc. -Copyright 2016-2017 Free Software Foundation, Inc. -Copyright (c) 1999-2000 by Massimo Piccioni -Copyright (c) 2008 Alan Stern -Copyright (c) 2009-2010 Marvell International Ltd. Haojian Zhuang -Copyright (c) 2004-2008, Sara Golemon All rights reserved -Copyright (c) 2006, 2007, 2008 Free Software Foundation, Inc. -Copyright (c) 2003, 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc. -Copyright (c) 2011,2012 Intel Corp. -Copyright (c) 1998,1999,2000 by Jacques Nomssi Nzali -Copyright (c) 1993 Hamish Macdonald -Copyright (c) 2011, Code Aurora Forum. All rights reserved -Copyright (c) 2008-2009 Avionic Design GmbH -Copyright (c) 2016 The OpenSSL Project. All rights reserved -Copyright (c) 1991-2006, 2007, 2008, 2009 Free Software Foundation, Inc. -Copyright (c) 2000 Free Software Foundation, Inc. -Copyright (c) 1996 Frank Neumann -Copyright (c) 1999-2001, 2003, 2011 Bruno Haible -Copyright IBM Corp. 2007 -Copyright IBM Corp. 2008 -Copyright (c) 2003 by Clemens Ladisch -Copyright (c) 1995 by Volker Lendecke -Copyright (c) 2001-2003, 2005-2017 Free Software Foundation, Inc. -Copyright (c) 2003-2006, Ericsson AB -Copyright (c) 2006 Intel Corporation. All rights reserved -Copyright (c) 2010 Henrik Rydberg -Copyright (c) 2008 Zhang Rui -Copyright (c) 2010-2011 by Samsung Electronics -(c) 1998 Grant R. Guenther -Copyright 1996 by Carsten Paeth (calle@calle.in-berlin.de) -Copyright (c) 2009-2010 Samsung Electrnoics MyungJoo Ham -Copyright (c) 2004 - 2017 Daniel Stenberg -Copyright (c) 2000 Takaya Kinjo -Copyright (c) 2005 ARM Ltd -Copyright (c) 2010 Texas Instruments, Inc. Thara Gopinath -Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved -Copyright (c) 1998,99 Takashi Iwai -Copyright (c) 2006 IBM Corporation -(c) 1985 MIPS Computer Systems, Inc. -Copyright (c) 2000-2008 The Regents -Copyright (c) 1992,1996,1997,1999,2004,2006 Free Software Foundation, Inc. -Copyright (c) 2008 QUALCOMM Incorporated -Copyright (c) 2010 Intel Corporation -Copyright (c) 1999-2005, 2016 Free Software Foundation, Inc. -Copyright (c) 2013, Linus Nielsen Feltzing, -Copyright (c) 1993 Linus Torvalds -Copyright (c) 1997,2000,2002,2009 Free Software Foundation, Inc. -Copyright (c) 2011 ST-Ericsson SA. -Copyright 2003-2005 Red Hat, Inc. All rights reserved -Copyright (c) 1991, 92, 96, 97, 98, 99 Free Software Foundation, Inc. -Copyright 2002 OProfile -(c) Copyright Jeremy Siek 2000 -Copyright (c) 2007 Ian Molton -Copyright (c) 1999-2002, 2012 Free Software Foundation, Inc. -(c) 2003 zecke@handhelds.org -Copyright 2005 Stephane Marchesin. All Rights Reserved -Copyright (c) 1999-2008 The OpenSSL Project. All rights reserved -Copyright (c) 2010 Marc Kleine-Budde -Copyright (c) 2003 Thomas Charbonnel (thomas@undata.org) -Copyright (c) 1991,92,93,95,96,97,98,99,2000,2009 Free Software Foundation, Inc. -Copyright (c) 2011 Volkswagen Group Electronic Research All rights reserved -Copyright (c) 2005, 2006, 2007 Cisco Systems. All rights reserved -Copyright (c) 1995-2002, 2004, 2005 Free Software Foundation, Inc. -Copyright (c) 2002 ARM Limited, All Rights Reserved -Copyright (c) 1999-2001, 2003, 2005, 2008, 2012 Free Software Foundation, Inc. -Copyright (c) 2005, Benedikt Spranger -Copyright 2012-2013 STMicroelectronics Inc. -Copyright (c) 1998 - 2011, Daniel Stenberg, -Copyright 2002-2021 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2009-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) -Copyright (c) 2012, Marc Hoersken, -Copyright (c) 2012 - 2016, Marc Hoersken, -Copyright 2007 OpenVZ SWsoft Inc -Copyright (c) 2005-2007, 2010-2011, Wind River Systems All rights reserved -Copyright (c) 2015 - 2019, Daniel Stenberg, -Copyright (c) 1997, 2001, 2006 Free Software Foundation, Inc. -Copyright (c) 1998-2012 Daniel Veillard. All Rights Reserved -Copyright (c) 2005-2007 Freescale Semiconductor, Inc. -Copyright (c) 2001-2005 The OpenSSL Project. All rights reserved -Copyright (c) 1999 - 2012 Greg Kroah-Hartman (greg@kroah.com) -Copyright 2002-2005, Devicescape Software, Inc. -Copyright (c) 1999,2001,2002,2003 Free Software Foundation, Inc. -Copyright (c) 2008 Voltaire, Inc. All rights reserved -Copyright (c) 2004 Topspin Communications. All rights reserved -Copyright (c) 2012, 2013 Minchan Kim -Copyright (c) 1990, 1991, 1993, 2008 Free Software Foundation, Inc. -Copyright 2010-2011 Analog Devices Inc. -Copyright (c) 2008-2011 Freescale Semiconductor, Inc. -Copyright (c) 1998 Paul Mackerras -Copyright (c) 2010 - 2012 by Daniel Stenberg -Copyright (c) 1992, 1995-2003, 2005-2017 Free Software Foundation, Inc. -Copyright (c) 2009-2010 Mathias Svensson http://result42.com -Copyright (c) 2010 Andres Salomon -Copyright (c) 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc. -Copyright (c) Intel 2011 -Copyright (c) 1991,92,93,96,97,98,2000,2004 Free Software Foundation, Inc. -Copyright (c) 2011 Jiri Pirko -Copyright (c) 2004 - 2005 Alex Aizman -Copyright (c) 1998, 1999, 2004, 2005 Free Software Foundation, Inc. -Copyright 2012, John Malmberg -Copyright (c) 2003 Nokia Corporation -Copyright (c) 2006-2009 Red Hat, Inc. -Copyright (c) 2016 - 2017, Steve Holme, -Copyright (c) 1998-2000 by Microgate Corporation -Copyright (c) 1992, 1995, 1996, 1999 Free Software Foundation, Inc. -Copyright (c) 1992 Rick Sladkey -Copyright (c) 2005, 2006 Chuck Lever -Copyright 2006, Michael Buesch -Copyright (c) 2009 Atmel Corporation -Copyright (c) 1999 SuSE GmbH Nuernberg -Copyright 1999 by Carsten Paeth -Copyright (c) 1996-1999,2001-2003,2005,2006,2007,2008,2009 Free Software Foundation, Inc. -Copyright Henrik Ravn 2004 -Copyright (c) 1983, 1993 The Regents -Copyright (c) 1998 - 2015, Daniel Stenberg, -Copyright (c) 2009, 2010 STMicroelectronics -Copyright (c) 2011 ST Microelectronics (Alessandro Rubini) -Copyright 2008 Bryan Ischo -Copyright (c) 2009 Jonathan Cameron -Copyright (c) 2004 Topspin Corporation. All rights reserved -Copyright (c) 2012 Samsung Electronics Co., Ltd -Copyright (c) 2003-2008, Lars Ellenberg -Copyright (c) 2011-2012 Peter Zijlstra -Copyright (c) 2002-2011 Mellanox Technologies LTD. All rights reserved -Portions Copyright (c) Sun Microsystems 2008 -Copyright (c) 2010,2011 Mellanox Technologies LTD. All rights reserved -Copyright (c) 1999 Andreas Gal -Copyright (c) 2008 by Sander Huijsen Troy Kisky -Copyright (c) 2000-2003, 2006, 2008-2017 Free Software Foundation, Inc. -Copyright (c) 1997, 1999 Dag Brattli , All Rights Reserved -Copyright 2007-2008 Pierre Ossman -Copyright (c) 2013 by Texas Instruments -Copyright (c) 2008 Greg Kroah-Hartman -Copyright (c) 2005-2007 Voltaire, Inc. All rights reserved -Copyright (c) 2012 Google, Inc -Copyright (c) 2010, Mandy Wu, -Copyright (c) 2005 Narayanan R -Copyright (c) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. -Copyright (c) 2008 Darius Augulis -Copyright (c) 2004-2007 James Smart, Emulex Corporation Rewrite -Copyright (c) 1999-2001 The OpenSSL Project. All rights reserved -Copyright (c) 2009 Wind River Systems, Inc. -Copyright 2011 Vista Silicon S.L. -Copyright (c) 2010 Samsung Electronics Minkyu Kang -Copyright (c) 2003 Nils-Erik Mattsson, Joacim Haggmark, Magnus Erixzon -Copyright (c) 2000-2002, 2004-2005 Free Software Foundation, Inc. -Copyright (c) 1999-2009 The OpenSSL Project. All rights reserved -Copyright (c) 2000-2010 Steven J. Hill David Woodhouse Thomas Gleixner -Copyright (c) 2011 Broadcom Corporation -Copyright (c) 2006-2008 Novell Inc. -Copyright (c) by Kai Svahn -Copyright (c) 1999, 2000, 2001 by Michael Engel and Karsten Merker -Copyright (c) 2008, Darius Augulis -Copyright (c) 2000-2004 The OpenSSL Project. All rights reserved -Copyright (c) 1996,1997 Silicon Graphics -(c) UNIX System Laboratories, Inc. -Copyright (c) 2005, 2007 Free Software Foundation, Inc. -Copyright (c) 2014 Qualcomm Atheros, Inc. -Copyright (c) 1996, 1997, 1999, 2001 Free Software Foundation, Inc. -Copyright (c) 2013 Shuah Khan -Copyright 2006 PathScale, Inc. All Rights Reserved -Copyright (c) 2012 Samsung Electronics Co.Ltd http://www.samsung.com -Copyright (c) 2000-2001 Qualcomm Incorporated -Copyright 2002, Bastiaan Bakker. All rights reserved -Copyright (c) 2008 Red Hat, Inc. All Rights Reserved -Copyright 2011 Roland Stigge -Copyright (c) 2000 Trond Myklebust -Copyright (c) 2012 - 2018, Daniel Stenberg, -Copyright (c) 2000 Grant Grundler, Hewlett-Packard -Copyright (c) 2000 by Andreas Gruenbacher -Copyright (c) 2005 Voltaire Inc. All rights reserved -Copyright (c) 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. -Copyright (c) 2005-2007 Jiri Slaby -Copyright (c) 1992, 1993, 1994, 1995 Remy Card (card@masi.ibp.fr) Laboratoire MASI - Institut Blaise Pascal -Copyright (c) 2000 David Odin -Copyright (c) 2000, 2004-2005, 2012, 2016 Free Software Foundation, Inc. -Copyright (c) 1999 David Mosberger-Tang -Copyright 2009 Johannes Berg -Copyright (c) 2001-2003, 2006-2017 Free Software Foundation, Inc. -Copyright (c) 2008 Panasas Inc. All rights reserved -Copyright (c) 2001, 2002, 2004, 2005, 2008 Free Software Foundation, Inc. -Copyright (c) 2011 Ivan Djelic -Copyright (c) 2015 Patrick Monnerat -Copyright (c) 2000, 2001, 2003 Free Software Foundation, Inc. -Copyright (c) 1990, 2001, 2003-2006, 2009-2017 Free Software Foundation -Copyright (c) 2009 Net Insight AB -Copyright (c) 2011 Renesas Solutions Corp. Kuninori Morimoto -Copyright (c) 2003, 2006 Free Software Foundation, Inc. -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. -Copyright (c) 2011 Instituto Nokia de Tecnologia -(c) 1999 David Jeffery -Copyright (c) 2012 Freescale Semiconductor, Inc. -Copyright (c) 1997, 1998, 1999, 2000, 2002, 2003, 2004 Free Software Foundation, Inc. -Copyright (c) 2001-2004 The OpenSSL Project. All rights reserved -Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 2006, 2007 Free Software Foundation, Inc. -Copyright (c) 2008, Guennadi Liakhovetski, DENX Software Engineering, -Copyright (c) 2005 Rusty Russell IBM Corporation -Copyright 2011-2016 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2013 Nikolay Aleksandrov -Copyright (c) 1998 - 2021, Daniel Stenberg, -Copyright (c) 2001 ARM Limited -Copyright (c) 2002-2013 Mark Adler, all rights reserved -Copyright (c) 1998 - 2013, 2017, Daniel Stenberg, -Copyright (c) 2012 Wolfram Sang, Pengutronix -Copyright (c) 2001-2010 David Woodhouse -Portions Copyright 2001 Sun Microsystems (thockin@sun.com) -Copyright (c) 1991, 1999 Free Software Foundation, Inc. -(c) Copyright 2001, 2002 Rusty Russell IBM Corporation -Copyright (c) 2002 The Regents -(c) Copyright 1997 Thomas Schoebel-Theuer -(c) 2002-2003 Intel Corp Inaky Perez-Gonzalez -Copyright (c) 1996-1998 Stallion Technologies -(c) 2007, SGI. Christoph Lameter -Copyright (c) 2005 Mike Christie -Copyright (c) 2000-2002, 2005-2006, 2008-2009, 2016 Free Software Foundation, Inc. -Copyright (c) 2009-2010 Mathias Svensson -Copyright (c) 2011-2012 Intel Corporation. All rights reserved -Copyright (c) 1999-2002 The OpenSSL Project. All rights reserved -Copyright 1994, Drew Eckhardt -Copyright (c) 1997, 1999, 2000, 2003 Free Software Foundation, Inc. -Copyright 1999-2019 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2013 Canonical Ltd. -Copyright (c) 2010 Nokia Corporation -Copyright (c) 1996-2003 Russell King -Copyright (c) 2011 Heiko Stuebner -Copyright 2013 Red Hat All Rights Reserved -Copyright (c) 2007 Cambridge Silicon Radio Ltd. -Copyright (c) 2007 Cisco Systems. All rights reserved -Copyright (c) 1997 by Volker Lendecke -Copyright 2007 Simtec Electronics Ben Dooks -Copyright 1995 Linus Torvalds -Copyright (c) 1999-2001, 2005, 2011, 2016 Free Software Foundation, Inc. -Copyright (c) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. -Copyright (c) 2012 ST-Ericsson SA -Copyright (c) 2009 - 2015, Daniel Stenberg, -Copyright (c) 2012 - 2015, Daniel Stenberg, -Copyright (c) 1995-1997 Olaf Kirch -Copyright (c) by Pavel Hofman -(c) 1995-2017 Jean-loup Gailly and Mark Adler -Copyright (c) by Jaroslav Kysela -Copyright (c) 2007 Alex Dubov -Copyright 2009-2011 Freescale Semiconductor, Inc. -Copyright (c) 1993-1999, 2000 Free Software Foundation, Inc. -Copyright (c) 1991, 1992 Linus Torvalds -Copyright (c) 1995, 1996 by Volker Lendecke -Copyright (c) 2010, Code Aurora Forum. All rights reserved -Copyright (c) 2014 Mellanox Technologies. All rights reserved -Copyright (c) 2001-2004, 2006 Free Software Foundation, Inc. -Copyright (c) 2012 ARM Limited -Copyright (c) 2010, Novell, Inc. -Copyright (c) 2012 Damian Hobson-Garcia -Copyright (c) 2010-2014, Daniel Stenberg -Copyright (c) 2001-2008 Miklos Szeredi -Copyright (c) 2010, Lars-Peter Clausen -Copyright 2005, Broadcom Corporation -Copyright (c) , All rights reserved -Copyright (c) 1998,99 Takashi Iwai , Jaroslav Kysela -Copyright 2011, ARM Ltd. -Copyright 2012 by Wolfram Sang -Copyright (c) 2002 Trond Myklebust -Copyright (c) 2007, 2008 Karsten Wiese -(c) Copyright 1999, 2000 Red Hat Software -Copyright (c) 2012 Red Hat, Inc. All Rights Reserved -Copyright (c) 2004-2012 Mellanox Technologies LTD. All rights reserved -Copyright (c) 2009 Motorola, Inc. -Copyright (c) 2011, SUSE, Jan Kara -Copyright (c) 2001-2003 International Business Machines, Corp. -Copyright (c) 2011 Boaz Harrosh -Copyright 1994-2000 Paul Mackerras -Copyright (c) 2011 Texas Instruments, Inc. -Copyright (c) 2002 Markus Friedl -Copyright (c) 2009 Samsung Electronics -Copyright (c) 2008 Lawrence Livermore National Lab. All rights reserved -Copyright (c) 2006, 2007, 2008, 2009, 2010 QLogic Corporation. All rights reserved -Copyright (c) 1992-1996, 1998-2012 Free Software Foundation, Inc. -Copyright (c) 1998-2003 Arnaldo Carvalho de Melo -Copyright (c) ARM Limited -Copyright (c) 2005 XenSource Ltd. -Copyright (c) 2004-2010 Mellanox Technologies LTD. All rights reserved -Copyright (c) 1999-2002 Vojtech Pavlik -Copyright (c) 1999-2008, 2011, 2016 Free Software Foundation, Inc. -Copyright (c) 2007 Panasas Inc. year of first publication All rights reserved -Copyright (c) 2011 Parrot S.A. -Copyright (c) 2011 Dialog Semiconductor Ltd. -Copyright (c) 2012 Invensense, Inc. -Copyright (c) 2016-2017 Free Software Foundation, Inc. -Copyright (c) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. -Copyright (c) 1999, 2000 Free Software Foundation -Copyright (c) 1998, 1999, 2002, 2003 Hewlett-Packard Co David Mosberger-Tang -Copyright (c) 2007 Philipp Zabel -Copyright (c) 1991,92,95-98,2000,2001,2004 Free Software Foundation, Inc. -Copyright (c) 2003 Krzysztof Benedyczak & Michal Wronski -Copyright (c) 2005-2007 Pierre Ossman, All Rights Reserved -Copyright (c) by Jaroslav Kysela -Copyright (c) 1995-1999, 2003, 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc. -Copyright (c) 2005 Jim Cromie -(c) 1998 Martin Mares -Copyright (c) 2004 - 2009 Red Hat, Inc. All rights reserved -Copyright (c) Miguel Ojeda Sandonis -Copyright Torsten Duwe 1993 -Copyright (c) 2014 Thomas Graf -Copyright (c) 2011 ARM Ltd. -Copyright (c) 2006, Timesys Corp., Thomas Gleixner -Copyright (c) 1997, 1998, 2000, 2002, 2003, 2007, 2008 Free Software Foundation, Inc. -Copyright (c) 2008 Red Hat, Inc. -Copyright (c) 2006, 2007, The -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -Copyright by Philips Automation Projects Kassel (Germany) -Copyright (c) Steven Whitehouse -Copyright (c) 1990, 1991 Sun Microsystems, Inc. -Copyright (c) Sistina Software, Inc. 1997-2003 All rights reserved -Copyright (c) 2011, Jim Hollinger -Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. -Copyright (c) 1998 Free Software Foundation, Inc. -Copyright (c) 2001,2002,2003,2005,2006 Free Software Foundation, Inc. -Copyright (c) 2002-2003 Greg Ungerer -Copyright (c) 2013 Red Hat, Inc. and Parallels Inc. All rights reserved -Copyright (c) 2009 Renesas Solutions Corp. -Copyright (c) 2009-2010 Texas Instruments Incorporated. Nishanth Menon Romit Dasgupta -Copyright (c) 1994-98 by Jaroslav Kysela , 4Front Technologies -Copyright (c) 1982, 1986, 1988, 1993 The Regents -Copyright 2008 Colin McCabe -Copyright (c) 1994, 1996, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. -Copyright (c) 2000 Holger Waechtler -Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved -Copyright (c) 1991, 1992, 1993, 1995, 1996, 1997, 2004 Free Software Foundation, Inc. -Copyright (c) 1998 - 2018, Daniel Stenberg, -Copyright 2000-2019 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2005 The University of Waikato, Hamilton -Copyright (c) 2007-2009 ST-Ericsson AB -Copyright (c) 2008-2009 Cisco Systems, Inc. All rights reserved -Copyright (c) 2005 PathScale, Inc. All rights reserved -Copyright (c) 1997-1999 Silicon Graphics Computer Systems, Inc. -Copyright (c) 1999,2000,2001,2002,2003,2009 Free Software Foundation, Inc. -Copyright (c) 2005, 2006, 2008 Free Software Foundation, Inc. -Copyright (c) 2004 S.Hauer, Pengutronix -Copyright (c) 2008, 2009, 2010 Simon Josefsson -Copyright (c) 1995-2001,2003,2004,2006,2009 Free Software Foundation, Inc. -Copyright 1993 United States -Copyright (c) 2006 Free Software Foundation, Inc. -Copyright (c) 2010 Marek Vasut -Copyright (c) 1988, 1997 Free Software Foundation, Inc. -Copyright (c) 1996-1998 Russell King -Copyright 2006-2010 Johannes Berg -Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved -Copyright (c) 2012 Texas Instruments Incorporated - http://www.ti.com All rights reserved -Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2005 Henk Vergonet -(c) Copyright 2009 Intel Corporation -Copyright 2007, 2008 Siemens AG -Copyright (c) 1992, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. -Copyright 1988 by Evans & Sutherland Computer Corporation, Salt Lake City, Utah -Copyright (c) 1992,94,1996-2000,2002,2004 Free Software Foundation, Inc. -Copyright (c) 2001-2002 by David Brownell -Copyright (c) 2001 Russell King -Copyright (c) 1991-2000,2003-2005,2009,2010 Free Software Foundation, Inc. -Copyright (c) 2004 Free Software Foundation, Inc. -Copyright 1993, 1994 Drew Eckhardt Visionary Computing -Copyright (c) 1999-2002, 2004, 2016 Free Software Foundation, Inc. -Copyright (c) 2012 Samsung Electronics MyungJoo Ham -Copyright (c) 1998 Silicon Graphics Computer Systems, Inc. -Copyright (c) 2002, 2003, 2004 Dell Inc. -Copyright (c) 2007-2011 Nicira Networks -Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2009 Mellanox Technologies LTD. All rights reserved -Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved -Copyright 2003-2004 Red Hat Inc., Durham, North Carolina. All Rights Reserved -Copyright 2002 Tungsten Graphics, Inc., Cedar Park, Texas. All Rights Reserved -Copyright (c) 1996, Olaf Kirch -Copyright (c) 2002 Free Software Foundation, Inc. -Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved -Copyright (c) 2013 Renesas Solutions Corp. -(c) Copyright 2007 Hewlett-Packard Development Company, L.P. -Copyright (c) 2004, 2005, 2006 Free Software Foundation, Inc. -Copyright (c) 1996-1997 Silicon Graphics Computer Systems, Inc. -Copyright 2004-2009 Freescale Semiconductor, Inc. All Rights Reserved -Copyright (c) 2001 La Monte H.P. Yarroll -Copyright (c) 2012 Guenter Roeck -Copyright (c) 1995-2006, 2011, 2016 Jean-loup Gailly -Copyright (c) 1999 Dag Brattli, All Rights Reserved -Copyright (c) 2002 NetChip Technology, Inc. (http://www.netchip.com) -Copyright (c) 1999-2003, 2005, 2008, 2012 Free Software Foundation, Inc. -Copyright (c) 2000-2006, 2008-2012 Free Software Foundation, Inc. -Copyright (c) 1992, 1996, 1997, 2000, 2008 Free Software Foundation, Inc. -Copyright (c) 2010 Jean Delvare -Copyright (c) 2006, 2011-2012 Free Software Foundation, Inc. -Copyright (c) 1986 Sun Microsystems, Inc. -Copyright (c) 2001-2002 Alcove -Copyright (c) Ashok Raj -Copyright (c) 2006 Samsung Electronics Kyungmin Park -Copyright (c) 1998-2000 Dag Brattli , All Rights Reserved -Copyright 2011 Maxim Integrated -Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved -Copyright (c) 2006 Andrey Volkov Varma Electronics Oy -Copyright (c) 2010-2011 Intel Corporation. All rights reserved -Copyright (c) 2001-2008, Philipp Reisner -Copyright (c) 1987, 1993 The Regents -Copyright (c) 2011 Samsung Electronics Co.Ltd -Copyright (c) 2000 Abramo Bagnara -Copyright (c) 2007-2008 Intel Corporation -Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -Copyright (c) 1999-2000 Maxim Krasnyansky -Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. -Copyright (c) 1995, 1996 by Paal-Kr. Engstad and Volker Lendecke -Copyright (c) 2008 Jonathan Cameron -Copyright (c) 2008 Atmel Corporation -Copyright (c) 1996 David S. Miller (davem@davemloft.net) -Copyright (c) 2008 Keith Packard -Copyright (c) 2004 - 2006 rt2x00 SourceForge Project -Copyright (c) 2007 Tejun Heo -Copyright (c) 2007, 2008, 2012 Mark Adler -Copyright (c) 2000-2001, 2004-2006, 2009-2017 Free Software Foundation, Inc. -Copyright (c) 2005-2008 Red Hat, Inc. All rights reserved -Copyright (c) 1997 by Procom Technology,Inc. 2001 by Arnaldo Carvalho de Melo -Copyright (c) 1995-2016 Jean-loup Gailly -Copyright (c) 2007 Takashi Iwai -Copyright (c) 1995 Olaf Kirch -Copyright (c) 2012-2013 Canonical Ltd -Copyright (c) 2007 Red Hat, Inc. All rights reserved -Copyright (c) 2007 Dmitry Torokhov -Copyright (c) 1994-97 Martin Buck -Copyright 2009 Wolfson Microelectronics -Copyright (c) 2005-2007 Samsung Electronics Kyungmin Park -Copyright 1994-2001 Stephen Rothwell (sfr@canb.auug.org.au) -(c) 1996-1998 by Thomas Sailer -Copyright (c) 2007 The -Copyright 2013, John Malmberg -Copyright (c) 2011 Free Electrons -Copyright 2009 Philipp Zabel -Copyright 1995,96 by Thinking Objects Software GmbH -Copyright (c) 2010 Texas Instruments, Inc -(c) Copyright 2008 Mathieu Desnoyers -Copyright (c) 2001, 2003, 2005, 2008-2017 Free Software Foundation, Inc. -Copyright (c) 2008-2009 Rodolfo Giometti -Copyright (c) 2006 Micron Technology Inc. -Copyright (c) 2002-2006 Mellanox Technologies LTD. All rights reserved -Copyright (c) 2001 Junichi Morita -Copyright 2000-2002 by Kai Germaschewski (kai@germaschewski.name) -Copyright 2008 Cisco Systems, Inc. All rights reserved -Copyright (c) 1995-2017 Jean-loup Gailly -Copyright (c) 2005 Ian Molton -Copyright (c) 1999-2001, 2016 Free Software Foundation, Inc. -Copyright (c) 2010 Intel Corporation -Copyright (c) 2015 - 2016, Daniel Stenberg, -Copyright (c) 2008 Red Hat, Inc., Eric Paris -Copyright (c) 2004, 2008 Red Hat, Inc. All Rights Reserved -Copyright (c) 2007-2013 VMware, Inc. All rights reserved -Copyright (c) 2010 Google, Inc -Copyright (c) 2013 Magnus Damm -Copyright (c) 2010 Simon Josefsson All rights reserved -Copyright (c) 2002 The OpenSSL Project. All rights reserved -Copyright (c) 1990-1996, 2000-2003, 2005-2007 Free Software Foundation, Inc. -Copyright (c) 2003, Intel Corporation -Copyright (c) 1997-1999 Dag Brattli , All Rights Reserved -Copyright (c) 2005 Sascha Hauer -Copyright (c) 2010 STMicroelectronics comes -Copyright 2006-2007 Pierre Ossman -Copyright (c) 2003 Ian Molton -Copyright (c) 2004 Paul Mundt -Copyright (c) 1996, 1997, 1998, 2003 Free Software Foundation, Inc. -Copyright (c) 2008, 2009, Simon Josefsson -Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. -(c) Copyright IBM Corp. 2001, 2004 -Copyright (c) 1996, 1997, 2001 Free Software Foundation, Inc. -Copyright (c) 2004 Thomas Gleixner (tglx@linutronix.de) -Copyright (c) 2004, 2008, 2012 Mark Adler, all rights reserved -Copyright (c) 2005 FUJITA Tomonori -Copyright (c) 2012 Amit Daniel -Copyright (c) 1989 Regents -Copyright (c) 1999-2000 Cisco, Inc. -Copyright (c) 2002, 2004, 2005 Free Software Foundation, Inc. -Copyright (c) 2011 Linaro Limited. All rights reserved -Copyright (c) 2003-2005, K A Fraser -Copyright (c) 1990, 1996, 2000-2003, 2005-2006 Free Software Foundation, Inc. -Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved -(c) 2003 - Rear -Copyright (c) 2009 Renesas Solutions, Inc. All rights reserved -Copyright (c) 1998-2003,2004 Free Software Foundation, Inc. -Copyright (c) 2000, 2002 Free Software Foundation, Inc. -Copyright (c) 2008-2009 Eurotech S.p.A. Michael Lawnick -Copyright 2008 Jouni Malinen -Copyright (c) 1999-2011, 2016 Free Software Foundation, Inc. -Copyright 2009 Benjamin Herrenschmidt, IBM Corp benh@kernel.crashing.org -Copyright (c) 2001, 2002, 2005 Free Software Foundation, Inc. -Copyright (c) 1999-2004, 2006-2007, 2010, 2012, 2016 Free Software Foundation, Inc. -Copyright (c) 2005-2006 Texas Instruments, Inc. -Copyright (c) 2005 Adaptec, Inc. All rights reserved -Copyright (c) 2005, 2006 Cisco Systems. All rights reserved -Copyright (c) 2001 by Jay Schulist -Copyright (c) 2009 Jason Wessel -Copyright (c) 2004, K A Fraser -Copyright (c) 1991-1993,1995-2006,2007,2009 Free Software Foundation, Inc. -Copyright (c) 2013 - 2014 Intel Mobile Communications GmbH -Copyright (c) 2006 - 2007 Ivo van Doorn -Copyright (c) 2005, Christopher Clark -Copyright (c) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. -Copyright (c) 2011, Microsoft Corporation -Copyright 1994-1999 by Fritz Elfert (fritz@isdn4linux.de) -Copyright (c) 2001-2005 Russell King -Copyright (c) 1996, 1997, 2005 Free Software Foundation, Inc. -Copyright (c) 2007 Texas Instruments, Inc. Lesly A -Copyright (c) 2003-2008, LINBIT Information Technologies GmbH. -Copyright (c) 2003-2004 Kevin Thayer -Copyright (c) 1998-2015 The OpenSSL Project. All rights reserved -Copyright (c) 1999-2016 The OpenSSL Project. All rights reserved -Copyright (c) 1999-2002, 2011-2012, 2016 Free Software Foundation, Inc. -Copyright (c) 2012, NVIDIA Corporation -Copyright (c) 2009 The OpenSSL Project. All rights reserved -Copyright (c) 2008, John W. Linville -Copyright (c) 2004 Freescale Semiconductor, Inc. -(c) Copyright 1997 by Carsten Paeth (calle@calle.in-berlin.de) -Copyright (c) 2012 Lothar Felten -Copyright (c) 2009 Texas Instruments, Inc -Copyright (c) 2005 Samsung Electronics Kyungmin Park -Copyright (c) 2011-2012 Texas Instruments -Copyright (c) 1997, 1998, 2001, 2007 Free Software Foundation, Inc. -Copyright (c) 2001, 2002, 2004, 2005 Free Software Foundation, Inc. -Copyright (c) 1998 - 2014 Douglas Gilbert -Copyright (c) 2005 John McCutchan -Copyright (c) 1991, 1994-2007, 2008, 2009 Free Software Foundation, Inc. -Copyright (c) 1997-2003, 2004, 2007, 2008 Free Software Foundation, Inc. -Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) -Copyright (c) 1999-2010, 2012, 2016 Free Software Foundation, Inc. -Copyright (c) 2006, Greg Kroah-Hartman -Copyright (c) 2009 Alexander Clouter -Copyright (c) 2002-2003 Hewlett-Packard Co David Mosberger-Tang -Copyright (c) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler -Copyright (c) 2003 Mark Adler -Copyright (c) 2006, 2007 Eugene Konev -Copyright (c) 1991-93,96,97,98,99,2001,2004 Free Software Foundation, Inc. -Copyright (c) 2006-2009 VMware, Inc., Palo Alto, CA., USA All Rights Reserved -Copyright (c) 1996-2013 Free Software Foundation, Inc. -Copyright (c) 1990-1998, 2000-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (c) 2006 Maciej W. Rozycki -Copyright (c) 2006 Cryptocom LTD -Copyright (c) 2013 - 2019, Daniel Stenberg, -Copyright (c) 2008 Advanced Micro Devices, Inc. -(c) 1993 Tommy Frandsen -Copyright (c) 1996-1998 Silicon Graphics Computer Systems, Inc. -Copyright 2002-2016 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2004 Open Source Development Labs -Copyright (c) 2009 Renesas Solutions Corp. Kuninori Morimoto -Copyright (c) 2010 ST Microelectronics Viresh Kumar -Copyright (c) 1999-2002, 2004-2011, 2016 Free Software Foundation, Inc. -Copyright (c) 2004 - 2005 Dmitry Yusupov -Copyright (c) 1991, 92, 93, 95, 96, 97, 99 Free Software Foundation, Inc. -Copyright (c) 2012 Renesas Corporation -Copyright (c) 2011-2013 Free Software Foundation, Inc. -Copyright (c) 1982, 1986, 1993 The Regents -Copyright (c) 1993, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. -Copyright 2000, Bastiaan Bakker. All rights reserved -Copyright (c) 2011, 2012 by Wolfram Sang, Pengutronix -Copyright 2006 NTT (Nippon Telegraph and Telephone Corporation) -Copyright (c) 1998 Frederic Rible F1OAT (frible@teaser.fr) Adapted -Copyright (c) 2004-2011 The OpenSSL Project. All rights reserved -Copyright (c) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler -Copyright (c) 1996,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) -Copyright (c) 2011-2012 by Texas Instruments -Copyright (c) 2001, 2002 Free Software Foundation, Inc. -Copyright (c) 2007 Ville Syrjala -Copyright (c) 1999-2008, 2011 Free Software Foundation, Inc. -Copyright (c) 2005 Stanislaw Skowronek -Copyright 1993-1998 Lucent Technologies, Inc. -Copyright (c) 2005 Stephen Street / StreetFire Sound Labs -portions copyright (c) 2007 Cluster -Copyright (c) 2003-2012 Daniel Veillard -Copyright (c) 2009 Secret Lab Technologies, Ltd. -Copyright (c) 1999 Walt Drummond -Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2003 Russell King, All Rights Reserved -Copyright (c) 2000-2009, 2011-2012, 2016-2017 Free Software Foundation, Inc. -Copyright (c) 2008 Robert Jarzmik -Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2007 Wind River Systems, Inc. -Copyright (c) 1994-2013 Free Software Foundation, Inc. -Copyright (c) 2006 Freescale - John Rigby -Copyright (c) 2000-2002 Jean Tourrilhes -Copyright (c) 2011 Marvell Semiconductors Inc. -Copyright (c) 2004-2008, Sara Golemon -Copyright (c) 2001 Nokia, Inc. -Copyright (c) 1996-1999,2000,2006,2007 Free Software Foundation, Inc. -Copyright (c) 1997,1998,1999,2001,2008,2009 Free Software Foundation, Inc. -Copyright (c) 1991,1992,1994,1995,1996,1997,1998,1999,2000,2001,2002,2006 Free Software Foundation, Inc. -Copyright Rusty Russell IBM Corporation 2007 -Copyright (c) 2002 David Howells (dhowells@redhat.com) -Copyright (c) 1998 David S. Miller (davem@redhat.com) -Copyright (c) 2014 Alexander Lamaison -Copyright 1993-2000 Lucent Technologies, Inc. -Copyright (c) 2010-2011 ST Microelectronics -Copyright (c) 2000 The OpenSSL Project. All rights reserved -Copyright (c) 2009 Marvell Technology Group Ltd. -Copyright 2011 Wolfson Microelectronics -Copyright (c) 1999-2013 Free Software Foundation, Inc. -Copyright (c) 2011 RICOH -Copyright (c) 1994 Sun Microsystems, Inc. -Copyright (c) 2017, Daniel Stenberg, -Copyright (c) 2012 Vojtech Fried -Copyright (c) 1997-2007 Jean Tourrilhes, All Rights Reserved -Copyright (c) 1999-2001, 2008, 2011-2012, 2016 Free Software Foundation, Inc. -Copyright (c) 1991,92,93,94,96,97,98,99, 2003 Free Software Foundation, Inc. -(c) 2012 Sasha Levin -Copyright 1999-2022 The OpenSSL Project Authors. All Rights Reserved -Copyright 2003-2004 Jeff Garzik -Copyright (c) 2003,2004 USAGI/WIDE Project -Copyright (c) 1995-1999, 2000, 2002 Free Software Foundation, Inc. -Copyright (c) 2004-2006 Silicon Graphics, Inc. -Copyright (c) 1999,2003 Matthew Wilcox -Copyright (c) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson -(c) 2001 by Andreas Gruenbacher, -copyright (c) 2011 Samsung Electronics Co., Ltd http://www.samsung.com -Copyright (c) 2007 Wouter Horre -Copyright (c) 2006 Atmark Techno, Inc. -Copyright (c) 2005 - James Bottomley -Copyright (c) 1997,1998,2000,2001,2002,2006 Free Software Foundation, Inc. -Copyright (c) 2000 Marcus Metzler & Ralph Metzler -Copyright (c) 2002 Marcel Holtmann -Copyright (c) 1991-2003, 2004, 2007, 2009 Free Software Foundation, Inc. -Copyright (c) 2012 - 2016, Linus Nielsen Feltzing, -Copyright (c) 2010 Renesas Solutions Corp. -Copyright (c) 2013 - 2014, Linus Nielsen Feltzing, -Copyright (c) 1999-2017 The OpenSSL Project. All rights reserved -Copyright (c) 2004 Russell King -Copyright (c) 2003, 2004 David Young. All rights reserved -Copyright (c) 1998-2003 The OpenSSL Project. All rights reserved -Copyright (c) 1992 Drew Eckhardt -Copyright (c) 1992,1994,1996,1997,2000,2004 Free Software Foundation, Inc. -Copyright (c) 1995-2001, 2004, 2005, 2006 Free Software Foundation, Inc. -Copyright (c) 1999-2001, 2005, 2016 Free Software Foundation, Inc. -Copyright (c) 2004 Jaroslav Kysela -Copyright (c) 1991, Sun Microsystems Inc. -Copyright (c) 2007 Free Software Foundation, Inc. -Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved -Copyright (c) 2011 Kuninori Morimoto -Copyright (c) 1996-2003 Intel Corporation. All rights reserved -Copyright 1995 by Randall Atkinson and Dan McDonald, All Rights Reserved -Copyright (c) 2011 Samsung Electronics Co., Ltd http://www.samsung.com -Copyright (c) 2010 Google, Inc. -Copyright (c) 1996, 1999, 2002, 2003, 2004 Free Software Foundation, Inc. -Copyright (c) 2011-2012 Guennadi Liakhovetski -Copyright (c) 1998-2010 The OpenSSL Project. All rights reserved -Copyright (c) 1997 Jes Sorensen -Copyright (c) 2005 Mikhail Gusarov -Copyright (c) 2009 Nuvoton technology corporation -Copyright (c) 2006-2009, Intel Corporation -Copyright (c) 2001 Greg Kroah-Hartman -Copyright (c) 2008 MontaVista Software, Inc. -Copyright (c) 2008 Philipp Zabel -Copyright (c) 1991-1999, 2000, 2004, 2008 Free Software Foundation, Inc. -Copyright (c) 2004, 2007, 2008 Free Software Foundation, Inc. -Copyright (c) 2013 Free Software Foundation, Inc. -Copyright 2009-2010 Pengutronix Uwe Kleine-Koenig -Copyright (c) 2011 Nitin Gupta -Copyright (c) 2009, 2011 Free Software Foundation, Inc. -Copyright (c) 2007,2008 Free Software Foundation, Inc. -Copyright (c) 2007, Riku Voipio -Copyright (c) 1998-1999 by Frank van de Pol -Copyright (c) 2001-2002, 2005, 2007, 2009-2017 Free Software Foundation -Copyright (c) 2007 Free Software Foundation, Inc. -Copyright (c) 1992 David Giller, rafetmad@oxy.edu 1994, 1995 Eberhard Monkeberg, emoenke@gwdg.de 1996 David van Leeuwen, david@tm.tno.nl 1997, 1998 Erik Andersen, andersee@debian.org 1998-2002 Jens Axboe, axboe@suse.de -Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved -Copyright (c) 2005 Patrick Mochel -Copyright 2002, LifeLine Networks BV (www.lifeline.nl). All rights reserved -Copyright (c) 1995,2001 Compaq Computer Corporation -Copyright (c) 2004-2009 Voltaire Inc. All rights reserved -Copyright (c) 2003 Sistina Software -Copyright (c) 2005 Mark M. Hoffman -Copyright (c) 1993, 1996, 1997, 1998, 1999, 2002 Free Software Foundation, Inc. -Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska HYe -Copyright (c) 2007 - 2009 Intel Corporation. All rights reserved -Copyright (c) 1998-1999 Ilario Nardinocchi (nardinoc@CS.UniBO.IT) -Copyright (c) 1999-2003, 2005, 2011-2012, 2016 Free Software Foundation, Inc. -Copyright (c) International Business Machines Corp., 2006 -Copyright 2011 Raumfeld GmbH -Copyright (c) 2002 Peter Dimov -Copyright (c) 2006-2008 Intel Corporation -Copyright (c) International Business Machines Corp., 2008 -Copyright (c) 1998-2002,2003 Free Software Foundation, Inc. -(c) Copyright 1999, Thomas Davis, tadavis@lbl.gov -Copyright (c) 2009-2010 Samsung Electrnoics Kyungmin Park Marek Szyprowski -Copyright (c) 2006 Mellanox Technologies Ltd. All rights reserved -Copyright (c) 2004-2006 Red Hat, Inc. All rights reserved -Copyright 2008 by Konrad Rzeszutek -Copyright (c) 2003-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (c) 2001-2008, LINBIT Information Technologies GmbH. -Copyright (c) 2004 Nokia Corporation -Copyright by Adam Belay -Copyright (c) 2012 Simon Budig, -Copyright (c) 1992, 1994 by Theodore Ts'o -(c) 2008 Krzysztof Piotr Oledzki -Copyright (c) 2000-2002 The OpenSSL Project. All rights reserved -Copyright (c) 1991-1997,2000,2006,2009 Free Software Foundation, Inc. -Copyright (c) 1999-2004, 2016 Free Software Foundation, Inc. -Copyright 2008 IBM Corp. -Copyright (c) 2010-2013, NVIDIA Corporation -Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. -Copyright (c) 2009, Darius Augulis -Copyright (c) 1999 - 2017, Daniel Stenberg, -Copyright (c) 1994-2001 by Jaroslav Kysela -Copyright (c) 2011 Manuel Stahl -Copyright (c) 2011 Intel Corporation -Copyright (c) 2008 Free Software Foundation, Inc. -Copyright (c) 2003 - 2012 Intel Corporation. All rights reserved -Portions Copyright (c) 1996-1999 by Internet Software Consortium -Copyright (c) 1998, 1999 David Mosberger-Tang -Copyright (c) 1998 Harald Koerfgen -Copyright (c) 2013 Intel Corporation -Copyright 2012 Steffen Trumtrar -Copyright (c) 2005-2008 ARM -Copyright (c) 2011 - 2018, Daniel Stenberg, -Copyright (c) 2005-2006 Kristian Hoegsberg -Copyright (c) 2001 - 2003 Sistina Software -Copyright 2009 Jonathan Corbet -Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved -Copyright (c) 2009 HNR Consulting. All rights reserved -Copyright (c) 2009, 2011, Markus Moeller, -Copyright (c) 2015 - 2018, Daniel Stenberg, -Copyright (c) 2001 Michael Ashley -Copyright (c) 1997,1999,2001,2006,2009 Free Software Foundation, Inc. -Copyright (c) 1996-1999 by Internet Software Consortium -Copyright (c) 2014, 2015 Alexander Lamaison -Copyright (c) 2009 Samsung Electronics Co. Ltd -Copyright 2002 GALILEO TECHNOLOGY, LTD. -Copyright (c) 2009 Voltaire, Inc. All rights reserved -Copyright (c) 2009 Alessandro Rubini -Copyright 2012 Tilera Corporation. All Rights Reserved -Copyright (c) 1993-1994, 1998, 2002-2006, 2009-2017 Free Software -Copyright (c) 2003 Red Hat, Inc. All Rights Reserved -Copyright (c) 2006 Ian Molton -Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen -Copyright (c) 1998, 2000, 2001, 2004, 2007 Free Software Foundation, Inc. -Copyright (c) 2012 Nobuhiro Iwamatsu -Copyright (c) 2000 Gary Pennington and Daniel Veillard -Copyright (c) 2011-2012 Intel Corporation -Copyright (c) 1999, 2002-2003 Hewlett-Packard Co. David Mosberger-Tang Stephane Eranian -Copyright (c) 2009 Karsten Keil 2002 Wolfgang Mues -Copyright (c) ST-Ericsson SA 2010-2013 -Copyright (c) 2012 Peter Meerwald -Copyright (c) 1997 Free Software Foundation, Inc. -Copyright (c) 1991, 1992, 1994, 1996, 1997, 2007 Free Software Foundation, Inc. -Copyright 2008 Analog Devices Inc. -Copyright (c) 1999-2001, 2005, 2008, 2016 Free Software Foundation, Inc. -Copyright (c) 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -Copyright (c) 2002-2003, Jouni Malinen -Copyright (c) 2004-2006 Intel Corporation. All rights reserved -Copyright (c) 1999-2012, 2016 Free Software Foundation, Inc. -Copyright (c) Alex Aizman, 2004 - 2005 -Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved -(c) 2012 Google, Inc. -Copyright 2004-2018 The OpenSSL Project Authors. All Rights Reserved -Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2003 Geert Uytterhoeven -Copyright (c) 2015 Linaro Ltd. -Copyright (c) 2012 Linaro Ltd. -Copyright 2008 by Karsten Keil -Copyright (c) 2011 Fuel7, Inc. All rights reserved -Copyright (c) 1999-2010 David Woodhouse -Copyright (c) 2006 Red Hat, Inc., Markus Armbruster -Copyright (c) 2006, Intel Corporation -Copyright (c) 2009-2015 Daniel Stenberg -Copyright 2016 VMS Software, Inc. All Rights Reserved -Copyright 2012 Wolfson Microelectronics -Copyright (c) Matt Helsley, IBM Corp. 2005 -Copyright (c) 2004 - 2018, Daniel Stenberg, -Copyright (c) 1998 - 2020, Daniel Stenberg, -Copyright (c) 2010 ST Microelectronics Shiraz Hashim -Copyright (c) 2012 - 2019, Daniel Stenberg, -Copyright (c) 1995-2005, 2010 Mark Adler -Copyright (c) 1991,1992,1996-1999,2003,2009 Free Software Foundation, Inc. -Copyright (c) 2004 - 2006 Intel Corporation. All rights reserved -Copyright (c) 1996 Silicon Graphics Computer Systems, Inc. -Copyright (c) 2010-2011, Mellanox Technologies Ltd. ALL RIGHTS RESERVED. -Copyright (c) 2005 by David Brownell -Copyright (c) 2009 Wolfgang Grandegger -Copyright (c) 2004 Voltaire Corporation. All rights reserved -Copyright (c) 1998, 1999 Greg Colvin and Beman Dawes -Copyright 2000,2001,2002 Red Hat -Copyright (c) 2001 Denis Oliver Kropp -Copyright (c) 2006 by Jaroslav Kysela -(c) 2000-2002 by Harald Welte -Copyright (c) 1995-1998, 2000-2002, 2004-2006, 2009-2017 Free Software -Copyright (c) 2009 Martin Fuzzey -Copyright (c) 1993,1995-1998,2000,2001,2003,2004,2007,2009 Free Software Foundation, Inc. -Copyright (c) 1998,2000 Free Software Foundation, Inc. -Copyright (c) 2009 Daniel Stenberg. All rights reserved -Copyright (c) 2017-2018, Yiming Jing, -Copyright (c) 2012 Marvell Technology Group Ltd. -Copyright (c) 2011 Mike Christie -Copyright (c) 2012 Samsung Electronics Co., Ltd. -Copyright (c) 2001 Michael Teo -Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved -(c) 2000 Crutcher Dunnavant -Copyright (c) 1997, 1999 Free Software Foundation, Inc. -(c) Copyright 2005 Robert Love -Copyright (c) 1991 Free Software Foundation, Inc. -Copyright (c) 2000 Takashi Iwai -Copyright (c) 1995-97 Simon G. Vogl -Copyright (c) 2008, Paulius Zaleckas -Copyright 2001, Walter Stroebel. All rights reserved -Copyright (c) 1998-2005 Hewlett-Packard Co David Mosberger-Tang -Copyright 1993 Harm Hanemaayer -Copyright (c) 1996-2017 Free Software Foundation, Inc. -Copyright (c) 2004, 2005 Paul Mundt -Copyright (c) by Abramo Bagnara -Copyright (c) 2004 Intel -Copyright (c) by Jaroslav Kysela Abramo Bagnara -Copyright (c) 2003 Intracom S.A. -Copyright (c) 2010 Mike Christie -Copyright (c) 2004-2007 Voltaire, Inc. All rights reserved -Copyright (c) 2000 Ralph Metzler & Marcus Metzler -Copyright (c) 1991, 1993 The Regents -Copyright (c) 2001, 2004 Free Software Foundation, Inc. -Copyright (c) 2008 James Bottomley -Copyright (c) 2001-2002, 2005-2007, 2009-2017 Free Software Foundation, Inc. -Copyright (c) 1998-2001,2004 Free Software Foundation, Inc. -(c) 1988 Silicon Graphics -Copyright (c) 2010 Samsung Electrnoics MyungJoo Ham -Copyright (c) 2007 Red Hat, Inc., Peter Zijlstra -Copyright (c) 1996-2015 Free Software Foundation, Inc. -(c) Copyright 2012 by Wolfram Sang, Pengutronix -Copyright (c) 2002 STMicroelectronics -Copyright (c) 1986, Sun Microsystems, Inc. -Copyright (c) 1998 - 2004 Mike D. Schiffman All rights reserved -Copyright 2001, Bastiaan Bakker. All rights reserved -Copyright (c) 2004, 2007 Red Hat, Inc. All Rights Reserved -Copyright (c) 1996, 1997, 1999, 2003, 2004 Free Software Foundation, Inc. -Copyright (c) 2006-2008 Barco N.V. -Copyright (c) 1998 - 2016, Daniel Stenberg, -Copyright (c) 2014 Red Hat, Inc. -(c) Steve Whitehouse 1999 -Copyright (c) 2001 Momchil Velikov -Copyright (c) 1996, 1997, 1999, 2008 Free Software Foundation, Inc. -Copyright (c) 1991-1993,1995-2001,2006,2009 Free Software Foundation, Inc. -Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2003, 2005 Free Software Foundation, Inc. -Copyright (c) 2009/2010 Stefani Seibold -Copyright (c) 1998-2001,2006 Free Software Foundation, Inc. -Copyright (c) 2006 The OpenSSL Project. All rights reserved -Copyright (c) 1996, 1997 Free Software Foundation, Inc. -Copyright 1998-1999 Lucent Technologies, Inc. -Copyright (c) 1986, 1990 by Sun Microsystems, Inc. -Copyright (c) 2012, Mark Salisbury, -Copyright (c) 2004, 2005, 2006 Red Hat, Inc., Ingo Molnar -(c) Copyright 2006 IBM Corp. -Copyright (c) 2002-2003 Hewlett-Packard Co Stephane Eranian -Copyright (c) 2009-2010 by Daniel Stenberg -Copyright (c) 2006, 2007 Ian Armstrong -Copyright (c) 2005-2006 Intel Corporation. Inaky Perez-Gonzalez -Copyright (c) 2008 Nokia Corporation. All rights reserved -Copyright 1988, 1989 by Carnegie Mellon University All rights reserved -Copyright (c) 1997, 1998, 1999, 2003, 2005 Free Software Foundation, Inc. -Copyright (c) IBM Corporation, 2008-2012 -Copyright (c) 2008 Dmitry Baryshkov -portions Copyright 2005, Red Hat, Inc., Ingo Molnar -Copyright (c) 2004 ARM Limited -Copyright 2011 Heiko Stuebner -Copyright (c) 2006 James Smart, Emulex Corporation -Copyright (c) 1996-2003, 2009 Free Software Foundation, Inc. -Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved -Copyright (c) 1991,92,93,95,96,97,98,99,2001,2002,2004,2007,2008,2009 Free Software Foundation, Inc. -Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -Copyright (c) 2009-2014 Daniel Stenberg -(c) MontaVista Software, Inc. Vitaly Bordug -Copyright (c) 2012 Konstantin Khlebnikov -Copyright (c) 2001-2003 Intel Corp. -Copyright (c) 2001 Russell King, All Rights Reserved -Copyright (c) 2008 Xsigo Systems Inc. All rights reserved -Copyright (c) 1998 - 2009, Daniel Stenberg, -Copyright (c) 2012 Renesas Solutions Corp. -Copyright (c) 2001-2002, 2006-2017 Free Software Foundation, Inc. -Copyright (c) 2012 Dialog Semiconductor Ltd. -(c) 2002 by Harald Welte -Copyright (c) 1999-2002 Free Software Foundation, Inc. -(c) 2004 Simtec Electronics http://www.simtec.co.uk/products/SWLINUX Ben Dooks -Copyright (c) 2009 Intel Corporation. All rights reserved -Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd. -Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2012 ST-Ericsson -Copyright (c) 2012 Texas Instruments, Inc. Paul Walmsley -Copyright (c) 2007 Intel Corporation. All rights reserved -Copyright (c) 1999-2001 Cisco, Motorola -(c) 2000 by Harald Welte -Copyright (c) 2002, Oracle -Copyright (c) 2008 Mellanox Technologies LTD. All rights reserved -Copyright (c) 1991-1993,1995-1997,2004,2009 Free Software Foundation, Inc. -Copyright (c) 2012 David Herrmann -Copyright (c) 1983 Regents -Copyright (c) 1990, 1998-2001, 2003-2006, 2009-2017 Free Software -Copyright 2016 The OpenSSL Project Authors. All Rights Reserved -Copyright 1996, 1997, 1998 Hans Reiser -Copyright (c) IBM Corporation, 2004 -Copyright (c) 2006, Ian Campbell -Copyright (c) 2005 David Brownell -Copyright (c) IBM Corporation, 2006 -Copyright (c) 1999-2013 The OpenSSL Project. All rights reserved -Copyright (c) 86, 91, 1995-1998, 1999, 2012 Free Software Foundation, Inc. -Copyright (c) 1998 Ian Zimmerman -Copyright (c) Peter Maydell -Copyright (c) 2010 Guennadi Liakhovetski -Copyright (c) 2008-2009 Michal Simek -Copyright 2014 Intel Corporation -Copyright (c) 2009, Jiejing Zhang -Copyright (c) 2001 - 2018, Daniel Stenberg, -Copyright (c) 2004, Intel Corporation -Copyright (c) 1995-1998 Eric Young (eay@cryptsoft.com) -Copyright (c) 2005-2011 Intel Corporation. All rights reserved -Copyright (c) 2014 Dan Streetman -Copyright (c) 2012 National Instruments -Copyright (c) 2006 AppSpec Computer Technologies Corp. Jeff Gibbons -Copyright (c) 2012 Red Hat, Inc. All rights reserved -Copyright 2005 Nokia. All rights reserved -Copyright (c) Russell King -Copyright (c) 2014 - 2016, Steve Holme, -Copyright (c) 1998-2018 The OpenSSL Project. All rights reserved -Copyright (c) 1998 - 2017, Daniel Stenberg, -Copyright (c) 2003 David Brownell -Copyright (c) 2011, Tom Herbert -(c) 2005 Harald Welte -Copyright (c) 2005 Rusty Russell, IBM Corporation -Copyright (c) Pavel Machek, pavel@ucw.cz -Copyright (c) 2000-2003 Free Software Foundation, Inc. -Copyright (c) 1999-2002, 2016 Free Software Foundation, Inc. -Copyright 2007-2010 Johannes Berg -Copyright (c) 2001-2011 The OpenSSL Project. All rights reserved -Copyright (c) 2003 Intel Co Suresh Siddha Fenghua Yu -Copyright (c) 1985,1989-93,1995-98,2000,2001,2002,2003,2005,2006,2008 Free Software Foundation, Inc. -Copyright (c) 2003-2004, K A Fraser -(c) 2003 - Rear Left -Copyright (c) SAN People -Copyright (c) 2002 James Morris -Copyright (c) 2002, 2007 Red Hat, Inc. All Rights Reserved -Copyright (c) 2003-2004 MontaVista, Software, Inc. -Copyright 2014 Advanced Micro Devices, Inc. -Copyright (c) by Takashi Iwai Jaroslav Kysela -Copyright (c) 2011 Free Software Foundation, Inc. -Copyright (c) 2006 Sony Computer Entertainment Inc. -Copyright (c) 2005 Ian Molton -Copyright (c) 1999-2001, 2008, 2011, 2016 Free Software Foundation, Inc. -Copyright (c) by Jaroslav Kysela Takashi Iwai -Copyright (c) 2012 Eric Dumazet -Copyright (c) 1995, 1996, 1997 Free Software Foundation, Inc. -Copyright (c) 2005 Richard Purdie -Copyright (c) 2000, 2003, 2004, 2009 Free Software Foundation, Inc. -Copyright (c) 1997 Michael AK Tesch -Copyright (c) 2005 Voltaire, Inc. All rights reserved -Copyright 2011 Intel Corporation -Copyright (c) 2005-2017 Free Software Foundation, Inc. -Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. -Copyright (c) 2009 emlix GmbH, Oskar Schirmer -(c) 1986 SMI -Copyright (c) 2004 Silicon Graphics, Inc. -Copyright (c) 2004 by Hansjoerg Lipp -Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. -Copyright (c) 2008 Intel Corp -Copyright (c) 2015 - 2017, Daniel Stenberg, -Copyright 2010 MontaVista Software, LLC. Anton Vorontsov -Copyright (c) 2009-2010 Nokia Corporation -(c) 2010 Red Hat Inc -Copyright (c) 1999-2006 Brian Paul All Rights Reserved -Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved -Copyright (c) 1995-1999 Russell King -Copyright (c) 2010, Daniel Stenberg -Copyright (c) 2010, Hoi-Ho Chan, -Copyright (c) 2012 BTicino S.p.A. -Copyright 2008 Sascha Hauer, kernel@pengutronix.de -Copyright (c) 2001-2004, 2006, 2009-2017 Free Software Foundation, Inc. -Copyright 2022 Huawei Technologies Co.,Ltd. -Copyright (c) 1998 Bjorn Reese and Daniel Stenberg -Copyright (c) 2005 Alex Aizman -Copyright (c) 1982, 1986 Regents -(c) 1997-1998 by Thomas Sailer -Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved -Copyright (c) 2008 SUSE LINUX Products GmbH -Copyright (c) 2001 WireX Communications, Inc -Copyright (c) 1998-2015 The OpenSSL Project -Copyright (c) 2003-2006, 2008-2012 Free Software Foundation, Inc. -Copyright (c) 1998-2000 Ilario Nardinocchi (nardinoc@CS.UniBO.IT) -Copyright (c) 2013 Andrey Smirnov -Copyright (c) 2012 Oliver Hartkopp -Copyright (c) 2011 Tieto Poland -Copyright (c) 2009 - 2014, Daniel Stenberg, -(c) Copyright 2007 Paulo R. Zanoni -Copyright (c) 1999-2005 Krzysztof Halasa -Copyright (c) 2006-2015 wolfSSL Inc. -Copyright (c) 1995,1996,1997,1998,2000,2001 Free Software Foundation, Inc. -Copyright (c) 2004, 2005 Intel Corporation. All rights reserved -Copyright (c) 1991, 92, 93, 94, 96, 98, 99 Free Software Foundation, Inc. -Copyright (c) 2002-2010 Mellanox Technologies LTD. All rights reserved -Copyright (c) 2006 Red Hat, Inc. All Rights Reserved -Copyright (c) 2010, 2011 Fabien Marteau -Copyright (c) 2009 Dmitry Torokhov -Copyright (c) 2010 Samsung Electronics MyungJoo Ham -Copyright (c) 2011-2012 Red Hat, Inc., Peter Zijlstra -Copyright (c) 2012 Renesas Electronics Corporation -Copyright (c) 2011 Samsung Electronics Co., Ltd. -Copyright (c) 2004 Dirk Behme -Copyright (c) 2011, Guennadi Liakhovetski -Copyright (c) 2007, D G Murray -Copyright (c) 2003-2017 Free Software Foundation, Inc. -Copyright (c) 1992, 1999, 2001, 2003, 2005, 2009-2017 Free Software -Copyright (c) 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. -Copyright 2006, Michael Buesch -Copyright 1987 Sun Microsystems, Inc. -Copyright 1994, Anders Klemets -Copyright 2008-2019 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 1989 Carnegie Mellon University. All rights reserved -Copyright 2002 Tungsten Graphics, Inc., Cedar Park, Texas. All rights reserved -(c) Copyright 1999 Bodo Moeller. All rights reserved -Copyright (c) 1994-2017 Free Software Foundation, Inc. -Copyright (c) 2007 Freescale Semiconductor, Inc. All rights reserved -Copyright IBM Corporation, 2013 -Copyright IBM Corporation, 2012 -Copyright (c) 2002,2003,2004,2005,2006,2007,2008 Free Software Foundation, Inc. -Copyright (c) Daniel Stenberg, -Copyright (c) 1998, 1999, 2001 Free Software Foundation, Inc. -Copyright (c) 2005 Ben Gardner -Copyright (c) 2002-2007 Volkswagen Group Electronic Research All rights reserved -Copyright (c) 2007 Craig W. Nadler -Copyright (c) 1992, 1996 Free Software Foundation, Inc. -Copyright IBM Corporation, 2008 -Copyright (c) 2002, 2003, 2004, 2007 Free Software Foundation, Inc. -Copyright IBM Corporation, 2007 -Copyright (c) 2006 Thomas Gleixner -Copyright (c) 2004 Simtec Electronics Ben Dooks -Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation -(c) Copyright 1999-2001 Quicknet Technologies, Inc. -(c) 2010-2011 Red Hat, Inc. -Copyright (c) 2006, 2007 Free Software Foundation, Inc. -Copyright IBM Corporation, 2001 -Copyright (c) 2008 Intel Corporation -Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved -Copyright (c) 1999-2006 Ralf S. Engelschall -Copyright (c) 2010, Intel Corp. Huang Ying -Copyright 1999 Jeff Garzik -Copyright 2008 Simtec Electronics Ben Dooks http://armlinux.simtec.co.uk -Copyright (c) 1999 Jeff Hartmann -Copyright (c) 2009 Intel Corporation -Copyright (c) 2004-2007 Hans Verkuil -Copyright (c) 2005 Cisco Systems. All rights reserved -Copyright (c) 2013-2017, Daniel Stenberg, -Copyright 2012 Maxime Ripard -Copyright 2006-2007 Jiri Benc -Copyright (c) 2009 Samsung Electronics Minkyu Kang -Copyright (c) 1987-1999 Carnegie Mellon University All Rights Reserved -Copyright (c) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation -Copyright 2014 IBM Corp. -Copyright (c) IBM Corporation, 2002, 2004 2002-Oct -Copyright (c) 2009, Markus Moeller, -Copyright (c) 2015 Intel Corporation -Copyright (c) 2000-2003, 2009-2017 Free Software Foundation, Inc. -Copyright 1999 Precision Insight, Inc., Cedar Park, Texas -Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. All rights reserved -(c) Amit S. Kale and 2003-2005 -Copyright (c) 1999 Eric A. Thomas -Copyright (c) 1999 Paul Rusty Russell & Michael J. Neuling -Copyright (c) 2004,2007,2008 IBM Corporation -Copyright ST-Ericsson 2010 -Copyright ST-Ericsson 2012 -Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved -Copyright 2005 Simtec Electronics Ben Dooks http://armlinux.simtec.co.uk -Copyright (c) 1997-1999 Richard Gooch -Copyright (c) 2008 Novell, Inc. -Copyright (c) 2005, 2010-2011, Wind River Systems All rights reserved -Copyright (c) 2005 Intel Corporation. All rights reserved -Copyright (c) 2002-2003 SnapGear Inc -Copyright 1999 Ben Pfaff and Petr Vandrovec -Copyright (c) 1998-1999 The OpenSSL Project. All rights reserved -Copyright (c) 2005 Anthony Liguori -Copyright (c) 1989 Carnegie Mellon University -Copyright (c) 2010-2014 by Daniel Stenberg -Copyright (c) 1998 - 2012, Daniel Stenberg, -Copyright (c) 2008 Mike Christie -Copyright (c) 2011-2017 Free Software Foundation, Inc. -Copyright (c) 1991,92,1994-2001,2003,2005,2007,2008 Free Software Foundation, Inc. -Copyright (c) 2002-2003 Dave Jones -Copyright (c) 2007 Cisco Systems, Inc. All rights reserved -Copyright (c) 2001, 2002, 2003 Patrick Mochel -Copyright (c) 1988-1994,1996-1999,2003,2004,2005,2009 Free Software Foundation, Inc. -Copyright (c) 2012 Hideki EIRAKU -Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -Copyright (c) 2012 The OpenSSL Project. All rights reserved -Copyright (c) 2010 Freescale Semiconductor, Inc. -Copyright (c) 1998 Ingo Molnar -Copyright (c) 1997, 1999, 2001, 2008 Free Software Foundation, Inc. -Copyright (c) 1992, 1998 Free Software Foundation, Inc. -Copyright (c) 1999-2001, 2005, 2007, 2016 Free Software Foundation, Inc. -Copyright (c) 1997-1999 Russell King -Copyright (c) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation -Copyright (c) 1995, 96, 98, 99, 2000 Free Software Foundation, Inc. -Copyright (c) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. -Copyright (c) 1999 Michael Gee (michael@linuxspecific.com) -Copyright (c) 1996, 1997, 1998, 1999, 2003 Free Software Foundation, Inc. -Copyright (c) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. -Copyright (c) 2012 Marvell -Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. -Copyright (c) 2009 Samsung Electronics Kim Kyuwon -Copyright (c) 2012 Samsung Electrnoics SangYoung Son -Copyright (c) 2006 Jing Min Zhao -Copyright 1996-1999 by Juliusz Chroboczek, David Turner, Robert Wilhelm, and Werner Lemberg -Copyright (c) 2003,2004 Hewlett-Packard Company -Copyright (c) 1980, 1993 The Regents -Copyright (c) 2002, 2004 Free Software Foundation, Inc. -Copyright (c) 2007 Jakob Bornecrantz -Copyright (c) 1999, 2000, 2001, 2002 - Karim Yaghmour (karim@opersys.com) -Copyright (c) 1996, 1999 Free Software Foundation, Inc. -Copyright (c) 2012 - 2017, Nick Zitzmann, -Copyright (c) 2001 Bjorn Reese and Daniel Stenberg -Copyright (c) 2010 Intel Corporation. All rights reserved -Copyright (c) 2010 Lars Nordin -Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 1995-97 Simon G. Vogl 1998-99 Hans Berglund -copyright Joerg Dorchain (dorchain@mpi-sb.mpg.de) -Copyright (c) 2005-2006 Intel Corporation. All rights reserved -Copyright (c) 1991, 1996, 1999, 2000, 2001 Free Software Foundation, Inc. -Copyright (c) 1997, 2005 Free Software Foundation, Inc. -Copyright (c) 1991, 1995, 1996, 2001 Free Software Foundation, Inc. -Copyright (c) by Jaroslav Kysela , Abramo Bagnara -Copyright (c) 2006 Jochen Voss -Copyright (c) 2001-2002, 2007, 2009-2017 Free Software Foundation, Inc. -Copyright (c) 2014 Intel Corporation. All rights reserved -Copyright (c) 1998,99,01,2002,2004 Free Software Foundation, Inc. -Copyright (c) 2001-2005 Stelian Pop -(c) INESC 1998 -Copyright (c) 1997, 1998, 1999, 2000, 2006 Free Software Foundation, Inc. -Copyright (c) 1995-1997,1999,2000,2003,2006,2007 Free Software Foundation, Inc. -Copyright (c) 2005 Herbert Xu -Copyright (c) 2004 MontaVista Software, Inc. -Copyright (c) 1997, 1998, 1999, 2000, 2001, 2004, 2005 Free Software Foundation, Inc. -Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 1996, 1997, 1998, 1999, 2007 Free Software Foundation, Inc. -Copyright (c) 2007 Silicon Graphics Inc. All rights reserved -Copyright (c) 1999-2006 The OpenSSL Project. All rights reserved -Copyright (c) 2012 Extreme Engineering Solution, Inc. -Copyright (c) 2007 Simula Research Laboratory. All rights reserved -Copyright (c) 1991-2001, 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. -Copyright (c) 1996 - 2019, Daniel Stenberg, -Copyright (c) 1996, 1999, 2001 David S. Miller (davem@redhat.com) -Copyright (c) 2005 Varma Electronics Oy -Copyright (c) 2001 The OpenSSL Project. All rights reserved -Copyright (c) 2008-2009 Novell Inc. -Copyright (c) 1998 - 2016, Vijay Panghal, -Copyright (c) 2005-2009 Atmel Corporation -Copyright (c) 1996, 1997, 1998, 1999, 2005 Free Software Foundation, Inc. -Copyright (c) 2000 Andrew Henroid -Copyright (c) 2008 Red Hat Inc. -(c) Copyright 1995 Simon Guru Aleph-Null Janes NCM Network and Communications Management, Inc. -Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved -Copyright (c) 1997-2012 University of Cambridge -Copyright (c) 1999 VMware, Inc. (Regis HPReg Duchesne) Made -Copyright (c) 2009 Marvell International Ltd. -Copyright (c) 2001, 2003, 2005, 2006, 2009 Free Software Foundation, Inc. - -License: Apache License V2.0 - -Software: spdlog 1.12.0 -Copyright notice: -Copyright (c) 2012 - 2016, Victor Zverovich -Copyright (c) 2012 - present, Victor Zverovich -Copyright (c) 2012 - present, Victor Zverovich and fmt contributors -Copyright (c) 2016 Gabi Melman. -Copyright (c) 2018 - present, Remotion (Igor Schulz) -Copyright (c) 2018 - present, Victor Zverovich and fmt contributors -Copyright (c) 2019 Two Blue Cubes Ltd. -Copyright 2017 Two Blue Cubes Ltd. -Copyright Paul Dreik 2019 -Copyright(c) 2015 Gabi Melman. -Copyright(c) 2015-present, Gabi Melman & spdlog contributors. -Copyright(c) 2015-present, Gabi Melman, mguludag and spdlog contributors. -Copyright(c) 2016 Alexander Dalshov. -Copyright(c) 2016 Gabi Melman. -Copyright(c) 2016-2018 Gabi Melman. -Copyright(c) 2018 Gabi Melman. -Copyright(c) 2019 ZVYAGIN.Alexander@gmail.com -Copyright(c) 2019 spdlog authors - -License: MIT License -Please see above diff --git a/VERSION b/VERSION deleted file mode 100644 index 79a2734bbf3de7aaf00e385c644d30704c03c7c8..0000000000000000000000000000000000000000 --- a/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.5.0 \ No newline at end of file diff --git a/build.sh b/build.sh deleted file mode 100755 index 1763f63b3034203b7f540d7698d47245d61e3aa5..0000000000000000000000000000000000000000 --- a/build.sh +++ /dev/null @@ -1,728 +0,0 @@ -#!/bin/bash -# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e -source /etc/profile.d/*.sh - -readonly USAGE=" -Usage: bash build.sh [-h] [-r] [-d] [-c off/on/html] [-t off|build|run] [-s on|off] [-j ] - [-p on|off] [-S address|thread|undefined|off] [-o ] [-u ] - [-B ] [-P on/off] [-X on/off] [-T ] - [-R on/off] [-D \"on \"/off] [-l ] [-i on/off] [-n on/off] - [-x on/off] - -Options: - -h Output this help and exit. - -r Release mode, default mode. - -d Debug mode. - -B Specifies the directory where the compilation process content is stored. If this parameter is specified, - an empty directory is recommended to prevent other files from being deleted, default is './build'. - -o Set the output path of the compilation result. If this parameter is specified, an empty directory - is recommended to prevent other files from being deleted, default is './output'. - -j Set the number of threads for compiling source code and compiling open source software, default is 8. - -T Set the third party versions if the default version need to be changed, default is ''. - Format: ';...', example: 'protobuf:3.13.0;' - -i Incremental compilation, choose from: on/off, default: off. - -n Use Ninja to speed up compilation, the default is to compile using Unix Makefiles, choose from: on/off, default: off. - - For multiple programming languages: - -P Build Python sdk, choose from: on/off/, default: on. Accepts on (default) to auto-detect a Python - version from the system environment, off to disable the build, or a path to prioritize the Python - at that specified location for search. - -X Compiles the code for heterogeneous objects. The options are on and off. The default value is 'on'. - - For communication layer - -M Build with URMA framework in addition to ZMQ, choose from on/off, default: off. - -D Download UB package that is needed for URMA, choose from on/off. When on, can also provide UB download options, default: on. - Notes to compile and run with URMA: - 1. The default packages are for EulerOS-V2R10 environment - 2. The downloaded rpm packages and the kernel modules need to be installed before run - Command to remove an rpm package: sudo rpm -e --nodeps - Command to install rpm packages: sudo rpm -ivh --force --nodeps *.rpm - Command to remove kernel modules: sudo rmmod uburma uboip uboib ubcore - Command to install kernel modules: sudo modprobe uburma;sudo modprobe uboib;sudo modprobe uboip;sudo modprobe ubcore - 3. OFED environment need to be configured for RDMA IB mode. IP mode can run without OFED. - Command to set up OFED environment: - ./mlnxofedinstall --without-depcheck --without-fw-update --force - /etc/init.d/openibd restart - - For debug code: - -p Generate perf point logs, choose from: on/off, default: off. - -s Use strip tool to export the symbol table as sym and erase symbols based on it, choose from: on/off, - default: on. - -S Use Google Sanitizers tools to detect bugs. Choose from off/address/thread/undefined, - if set the value to 'address' enable AddressSanitizer, - if set the value to 'thread' enable ThreadSanitizer, - if set the value to 'undefined' enable UndefinedBehaviorSanitizer, - default off. - -x Support jemalloc memory profiling. - - For testcase: - -c Build coverage, choose from: off/on/html, default: off. - -u CTest run the testcases in parallel using the given number of jobs, default is 8. - -t Compiling or running testcases, default off. Choose from: off/build/run/run_except_cpp/run_cases/run_cpp/run_python/run_example. - Field 'off' indicates that testcases are not compiled and executed. - Field not 'off', The 'tools' directory will be generated under the compilation result path - curve_keygen (generate zmq public and private keys) and - hashring_parser (parse hashringPb) will be generated under the 'tools' directory. - Field 'build' indicates that testcases are compiled but not run. - Field 'run' indicates that testcases are compiled and run. - Field 'run_except_cpp' indicates that testcases are run, except cpp ut. - Field 'run_cases' indicates that only testcases are run. - Field 'run_cpp' indicates that only cpp testcases are run. - Field 'run_python' indicates that only python testcases are run. - Field 'run_example' indicates that only example testcases are run. - -l The label of testcases, effective when '-t run/run_cases/run_cpp', default: level*. - Regular expression: object*/ut*/st*/level*, example: object/ut/st/level0/level1. - -m The timeout period of testcases, the unit is second, default: 40. - -Environment: -1) DS_JEMALLOC_LG_PAGE: Explicitly sets the page size used by the jemalloc. page size=2^\${DS_JEMALLOC_LG_PAGE} bytes. - When this variable is omitted, jemalloc infers the system's page size at build time from the build environment - (e.g., via sysconf(_SC_PAGESIZE) or equivalent). Only set DS_JEMALLOC_LG_PAGE if the runtime system's page size - differs from the one detected at build time and you must override the value. -2) DS_OPENSOURCE_DIR: Specifies a directory to cache the opensource compilation result. - Cache the compilation result to speed up the compilation. Default: /tmp/{sha256(pwd)}/ -3) DS_VERSION: Customize a version number during compilation. -4) DS_PACKAGE: If specified, third-party libs for the path provided by this variable will be compiled, for - version build only. -5) CTEST_OUTPUT_ON_FAILURE: Boolean environment variable that controls if the sdk output should be logged for - failed tests. Set the value to 1, True, or ON to enable output on failure. - -Example: -1) Compile a release version and export compilation result to the output directory. - $ bash build.sh -r -o ./output -" - -readonly BASE_DIR=$(dirname "$(readlink -f "$0")") -readonly DATASYSTEM_DIR="${BASE_DIR}" - -export PATH=$PATH:${BASE_DIR}/scripts/modules - -. llt_util.sh - -function init_default_opts() { - export BUILD_TYPE="Release" - export INSTALL_DIR="${DATASYSTEM_DIR}/output" - export BUILD_DIR="${DATASYSTEM_DIR}/build" - export BUILD_THREAD_NUM=8 - export ADDITIONAL_CMAKE_OPTIONS=() - export BUILD_INCREMENT="off" - export BUILD_WITH_NINJA="off" - - # For communication layer - export BUILD_WITH_URMA="off" - export DOWNLOAD_UB="off" - export UB_URL="" - export UB_SHA256="" - - # For testcase - export BUILD_TESTCASE="off" - export BUILD_COVERAGE="off" - export GEN_HTML_COVERAGE="off" - export RUN_TESTS="off" - export TEST_PARALLEL_JOBS=8 - export LLT_LABELS="level*" - export LLT_LABELS_EXCLUDE="" - export LLT_TIMEOUT_S=80 - - # For debug - export ENABLE_STRIP="on" - export ENABLE_PERF="off" - export USE_SANITIZER="off" - - # For packaging mutil language - export PACKAGE_PYTHON="on" - export PYTHON_ROOT_DIR="" - - # Whether to build device object. - export BUILD_HETERO="on" - - # Whether support jemalloc memory profiling - export SUPPORT_JEPROF="off" - -} - -function check_on_off() { - if [[ "X$1" != "Xon" && "X$1" != "Xoff" ]]; then - echo -e "Invalid value $1 for option -$2" - echo -e "${USAGE}" - exit 1 - fi -} - -function check_sanitizers() { - typeset -u name - local name - name="$1" - if [[ "X$name" != "XADDRESS" && "X$name" != "XTHREAD" && "X$name" != "XUNDEFINED" && "X$name" != "XOFF" ]]; then - echo -e "Invalid value $1 for option -$2" - echo -e "${USAGE}" - exit 1 - fi -} - -function check_labels() { - typeset -u labels - local labels - labels="$1" - if [[ ! "$labels" =~ ^(OBJECT|UT|ST|LEVEL)* ]]; then - echo -e "Invalid value $1 for option -$2" - echo -e "${USAGE}" - exit 1 - fi -} - -function is_on() { - if [[ "X$1" = "Xon" ]]; then - return 0 - else - return 1 - fi -} - -function check_number() { - local number_check - number_check='^([0-9]+)$' - if [[ "$1" =~ ${number_check} ]]; then - return 0 - else - echo -e "Invalid value $1 for option -$2" - echo -e "${USAGE}" - exit 1 - fi -} - -function go_die() { - local err_msg="$1" - local ret="$2" - echo -e "${err_msg}" >&2 - if [[ -n "${ret}" ]]; then - exit "${ret}" - else - exit 1 - fi -} - -function parse_thirdparty_versions() { - local versions_str="$1" - IFS=';' read -ra lib_version_pairs <<<"$versions_str" - for ((i = 0; i < ${#lib_version_pairs[@]}; i++)); do - local str=${lib_version_pairs[i]} - IFS=':' read -ra lib_version_pair <<<"$str" - if [[ ${#lib_version_pair[@]} -eq 2 ]]; then - local lib_name=${lib_version_pair[0]} - local version=${lib_version_pair[1]} - ADDITIONAL_CMAKE_OPTIONS[${#ADDITIONAL_CMAKE_OPTIONS[@]}]="-D${lib_name}_VERSION=${version}" - else - go_die "-- Error thirdparty specified: ${versions_str}" - fi - done -} - -function parse_ub_download_options() { - local args - check_on_off "$1" D - DOWNLOAD_UB="$1" - if [[ $# -eq 3 ]]; then - UB_URL="$2" - UB_SHA256="$3" - fi -} - -function remove_running_pids() { - # Clean master and worker processes because the processes continue to run if the test exits abnormally. - echo -e "-- Cleaning master processes and worker processes..." - ps -ef | grep -E "worker|master" | grep "${DATASYSTEM_DIR}" | grep -v grep | awk '{print $2}' | xargs kill -15 -} - -function gen_html_coverage_report() { - echo -e "---- generating coverage report, please wait a moments..." - local cov_report_dir="${DATASYSTEM_DIR}/coverage_report" - [[ -d "${cov_report_dir}" ]] && rm -rf "${cov_report_dir}" - mkdir -p "${cov_report_dir}/.info" - - # find all directories with the suffix ".gcda" - find ./ -type f | grep ".*\.gcda" | xargs dirname | sort -u | xargs realpath >"${cov_report_dir}/.info.txt" - - # generate coverage info file. - local cnt=0 - while IFS= read -r dir; do - lcov --rc lcov_branch_coverage=1 -c -d "${dir}" -o "${cov_report_dir}/.info/${cnt}.info" 1>/dev/null || go_die "---- generate coverage report failed!" 0 - cnt=$((cnt + 1)) - done <"${cov_report_dir}/.info.txt" - - # aggregate all Info files into one file. - local files - files=$(ls "${cov_report_dir}/.info") - local cmd="lcov " - for file in ${files}; do - cmd="${cmd} -a ${cov_report_dir}/.info/${file}" - done - cmd="${cmd} -o ${cov_report_dir}/.info/raw_cov.info 1>/dev/null" - eval "${cmd}" || go_die "---- generate coverage report failed!" 0 - - # picking out the parts we care about - lcov --extract "${cov_report_dir}/.info/raw_cov.info" "*src/datasystem/*" -o "${cov_report_dir}/.info/half_baked_cov.info" 1>/dev/null || go_die "---- generate coverage report failed!" 0 - lcov --remove "${cov_report_dir}/.info/half_baked_cov.info" "*/protos/*" -o "${cov_report_dir}/.info/well_done_cov.info" 1>/dev/null || go_die "---- generate coverage report failed!" 0 - - # generate html report - genhtml -t "datasystem" -o "${cov_report_dir}" "${cov_report_dir}/.info/well_done_cov.info" 1>/dev/null || go_die "---- generate coverage report failed!" - rm -rf "${cov_report_dir}/.info" "${cov_report_dir}/.info.txt" - echo -e "---- generate coverage report done, saved in ${cov_report_dir}" -} - -function build_example() { - echo -e "---- building example..." - local example_build_dir="${DATASYSTEM_DIR}/example/build" - # clean and create build dir. - [[ "${BUILD_INCREMENT}" == "off" && -d "${example_build_dir}" ]] && rm -rf "${example_build_dir}" - mkdir -p "${example_build_dir}" && cd "${example_build_dir}" - - local prefix_path - prefix_path=${INSTALL_DIR}/sdk/cpp - - cmake "${DATASYSTEM_DIR}/example" \ - -DCMAKE_PREFIX_PATH="${prefix_path}" \ - -DBUILD_HETERO="${BUILD_HETERO}" \ - -DBUILD_WITH_URMA="${BUILD_WITH_URMA}" \ - -DENABLE_PERF=${ENABLE_PERF} || go_die "---- build example CMake project failed!" - make || go_die "---- example make failed!" - - echo -e "---- build example success!" -} - -function run_example() { - if [[ "${RUN_TESTS}" = "run" || "${RUN_TESTS}" = "run_except_cpp" || "${RUN_TESTS}" = "run_cases" || "${RUN_TESTS}" = "run_example" ]]; then - local baseTime_s - baseTime_s=$(date +%s) - echo -e "---- Start Smoke Testing..." - - # unpackage the tar file. - cd "${INSTALL_DIR}" - tar -zxf yr-datasystem-v$(cat "${BASE_DIR}/VERSION").tar.gz - cd - - - # sanitize path - local old_ld_path=$LD_LIBRARY_PATH - local new_ld_path=$(echo $old_ld_path | tr ':' '\n' | grep -v "output/service" | grep -v "output/sdk" | tr '\n' ':') - export LD_LIBRARY_PATH=$new_ld_path - echo -e "---- Sanitize LD_LIBRARY_PATH from ${old_ld_path} to ${new_ld_path}" - - python3 -m pip install ${INSTALL_DIR}/openyuanrong_datasystem-*.whl --force-reinstall - bash "${DATASYSTEM_DIR}/example/run-example.sh" "${BUILD_HETERO}" "${ENABLE_PERF}" || - (remove_running_pids && go_die "---- Smoke Testing failed!") - echo -e "---- Smoke Testing success!" - echo -e "---- [TIMER] Run example: $(($(date +%s)-$baseTime_s)) seconds" - - # clean unpackage files. - rm -rf "${INSTALL_DIR}/service" "${INSTALL_DIR}/sdk" - fi -} - -function run_ut() { - cd "${BUILD_DIR}" - # run testcases if RUN_TESTS is run. - echo -e "---- running datasystem testcases..." - - local baseTime_s - baseTime_s=$(date +%s) - # Run all testcases in parallel and don't print the log out. - # In general, people would not see any log messages at this time. - # The timeout period is 100 seconds. - ctest --timeout "${LLT_TIMEOUT_S}" --schedule-random --parallel "${TEST_PARALLEL_JOBS}" \ - --label-regex "${LLT_LABELS}" --label-exclude "${LLT_LABELS_EXCLUDE}" || - # We will give the failed test cases two more chances to redeem - # themselves, but just run with single process to ensure the - # cases that fail occasionally can succeed. This time we will - # print the client log if user set `CTEST_OUTPUT_ON_FAILURE` env. - ctest --rerun-failed --timeout "${LLT_TIMEOUT_S}" --parallel "$((TEST_PARALLEL_JOBS/2))" --output-on-failure || - ctest --rerun-failed --timeout "${LLT_TIMEOUT_S}" --output-on-failure || - go_die "---- run datasystem testcases failed!" - echo -e "---- run datasystem testcases success!" - echo -e "---- [TIMER] Run ctest: $(($(date +%s)-$baseTime_s)) seconds" - - if is_on "${GEN_HTML_COVERAGE}"; then - gen_html_coverage_report - fi -} - -function run_ut_python() { - echo -e "---- running python testcases..." - local python_test_dir="${DATASYSTEM_DIR}/tests/python" - cd ${python_test_dir} - python3 -m unittest || (remove_running_pids && go_die "---- run datasystem testcases failed!") - echo -e "---- run datasystem python testcases success!" -} - -function clean_dirs() { - echo -e "cleaning..." - [[ -d "${DATASYSTEM_DIR}/build" ]] && rm -rf "${DATASYSTEM_DIR}/build" - [[ -d "${INSTALL_DIR}" ]] && rm -rf "${INSTALL_DIR}" - [[ -d "${DATASYSTEM_DIR}/third_party/build" ]] && rm -rf "${DATASYSTEM_DIR}/third_party/build" - [[ -d "${DATASYSTEM_DIR}/example/build" ]] && rm -rf "${DATASYSTEM_DIR}/example/build" - echo -e "done!" -} - -function strip_symbols() { - local src_dir="$1" - local dest_dir="$2" - if [[ ! -d "${dest_dir}" ]]; then - mkdir -p "${dest_dir}" - fi - - for file in ${src_dir}/*; do - local type - type="$(file -b --mime-type ${file} | sed 's|/.*||')" - local basename - basename=$(basename "${file}") - if [[ ! -L "${file}" ]] && [[ ! -d "${file}" ]] && [[ "x${type}" != "xtext" ]] && [[ "x${basename}" != "xlibacl_plugin.so" ]]; then - echo "---- start to strip ${file}" - objcopy --only-keep-debug "${file}" "${dest_dir}/${basename}.sym" - objcopy --add-gnu-debuglink="${dest_dir}/${basename}.sym" "${file}" - objcopy --strip-all "${file}" - fi - done -} - -function set_datasystem_version() { - if [[ "x${DS_VERSION}" != "x" ]]; then - local char_check='^([a-zA-Z0-9\.]+)$' - if [[ "$DS_VERSION" =~ ${char_check} ]]; then - echo "$DS_VERSION" >"${DATASYSTEM_DIR}/VERSION" - else - echo -e "The env DS_VERSION $DS_VERSION is invalid." - echo -e "${USAGE}" - exit 1 - fi - fi -} - -function run_manual_ut() -{ - if [[ "${RUN_TESTS}" = "run" || "${RUN_TESTS}" = "run_except_cpp" || "${RUN_TESTS}" = "run_cases" || "${RUN_TESTS}" = "run_python" ]]; then - if is_on "${PACKAGE_PYTHON}"; then - # Export "BUILD_HETERO", which is used to determine whether to execute heterogeneous related python test cases. - if is_on "${BUILD_HETERO}"; then - export BUILD_HETERO="on" - fi - - # unpackage the tar file. - cd "${INSTALL_DIR}" - tar -zxf yr-datasystem-v$(cat "${BASE_DIR}/VERSION").tar.gz - cd - - - local baseTime_s - baseTime_s=$(date +%s) - if [[ "${RUN_TESTS}" = "run_python" ]]; then - python3 -m pip install ${INSTALL_DIR}/openyuanrong_datasystem-*.whl --force-reinstall - fi - start_all "${BUILD_DIR}" "${INSTALL_DIR}" - run_ut_python - stop_all "${INSTALL_DIR}" - echo -e "---- [TIMER] Run python llt: $(($(date +%s)-$baseTime_s)) seconds" - - # clean unpackage files. - rm -rf "${INSTALL_DIR}/service" "${INSTALL_DIR}/sdk" - fi - fi -} - -function run_automated_ut() -{ - if [[ "${RUN_TESTS}" = "run" || "${RUN_TESTS}" = "run_cases" || "${RUN_TESTS}" = "run_cpp" ]]; then - run_ut - fi -} - -function run_testcases() -{ - # run smoke test - run_example - # run ut that require manually starting workers. - run_manual_ut - # run ut that automatically start workers - run_automated_ut -} - -function version_lt() -{ - [ "$1" = "$(echo -e "$1\n$2" | sort -V | head -n1)" ] && [ "$1" != "$2" ] -} - -function build_datasystem() -{ - # clean and create build dir. - [[ "${BUILD_INCREMENT}" == "off" && -d "${BUILD_DIR}" ]] && rm -rf "${BUILD_DIR}" && echo -e "--[Warning] Removed build folder ${BUILD_DIR}" - mkdir -p "${BUILD_DIR}" && cd "${BUILD_DIR}" - [[ "${BUILD_INCREMENT}" == "off" && -d "${INSTALL_DIR}" ]] && rm -rf "${INSTALL_DIR}" && echo -e "--[Warning] Removed output folder ${INSTALL_DIR}" - mkdir -p "${INSTALL_DIR}" - - echo -e "-- building datasystem in ${BUILD_DIR}..." - - # # build datasystem framework. - if [[ "${RUN_TESTS}" != "off" ]]; then - BUILD_TESTCASE="on" - fi - - local cmake_options=( - "${DATASYSTEM_DIR}" - "-DCMAKE_BUILD_TYPE:STRING=${BUILD_TYPE}" - "-DUSE_SANITIZER:STRING=${USE_SANITIZER}" - "-DCMAKE_INSTALL_PREFIX:PATH=${INSTALL_DIR}" - "-DWITH_TESTS:BOOL=${BUILD_TESTCASE}" - "-DBUILD_COVERAGE:BOOL=${BUILD_COVERAGE}" - "-DENABLE_PERF:BOOL=${ENABLE_PERF}" - "-DBUILD_PYTHON_API:BOOL=${PACKAGE_PYTHON}" - "-DBUILD_THREAD_NUM:STRING=${BUILD_THREAD_NUM}" - "-DENABLE_STRIP:BOOL=${ENABLE_STRIP}" - "-DBUILD_HETERO:BOOL=${BUILD_HETERO}" - "-DBUILD_WITH_URMA:BOOL=${BUILD_WITH_URMA}" - "-DDOWNLOAD_UB:BOOL=${DOWNLOAD_UB}" - "-DUB_URL:STRING=${UB_URL}" - "-DUB_SHA256:STRING=${UB_SHA256}" - "-DSUPPORT_JEPROF:BOOL=${SUPPORT_JEPROF}" - ) - if is_on "${PACKAGE_PYTHON}" && [ -n "${PYTHON_ROOT_DIR}" ]; then - echo -e "-- Specify python root path: ${PYTHON_ROOT_DIR}" - cmake_options=("${cmake_options[@]}" "-DPython3_ROOT_DIR:PATH=${PYTHON_ROOT_DIR}") - fi - if is_on "${BUILD_WITH_NINJA}"; then - cmake_options=("-G" "Ninja" "${cmake_options[@]}") - else - cmake_options=("-G" "Unix Makefiles" "${cmake_options[@]}") - fi - cmake_options=("${cmake_options[@]}" "${ADDITIONAL_CMAKE_OPTIONS[@]}") - - local baseTime_s - baseTime_s=$(date +%s) - cmake_version=$(cmake --version | head -n 1 | cut -d ' ' -f 3) - cmake_version_release=3.28 - - if [ -z "$cmake_version" ]; then - echo "Unable to retrieve the CMake version" - exit 1 - fi - - if !(version_lt "${cmake_version}" ${cmake_version_release}); then - echo "CMake version: ${cmake_version} greater than or equal to ${cmake_version_release}" - bash "${DATASYSTEM_DIR}/scripts/build_thirdparty.sh" "${BUILD_DIR}" "${BUILD_THREAD_NUM}" "${cmake_options[@]}" - else - echo " CMake version: ${cmake_version} less than ${cmake_version_release}" - fi - - cmake "${cmake_options[@]}" || go_die "-- build datasystem CMake project failed!" - cmake --build "${BUILD_DIR}" -j "${BUILD_THREAD_NUM}" || go_die "-- datasystem cmake build failed!" - cmake --install "${BUILD_DIR}" || go_die "-- datasystem cmake install failed!" - cp "${DATASYSTEM_DIR}/LOG_README" "${INSTALL_DIR}/service/" - echo -e "---- [TIMER] Build source: $(($(date +%s)-$baseTime_s)) seconds" - - # erase symbol table if need. - if is_on "${ENABLE_STRIP}"; then - if [[ "${BUILD_TYPE}" = "Debug" ]]; then - echo -e "WARNING: Build in debug mode and use strip tool to erase symbol table, it could be a problem when you use gdb." - fi - strip_symbols "${INSTALL_DIR}/sdk/cpp/lib" "${INSTALL_DIR}/sdk/DATASYSTEM_SYM" - if is_on "${BUILD_HETERO}"; then - cp ${BUILD_DIR}/src/datasystem/common/device/ascend/plugin/libacl_plugin.so.sym "${INSTALL_DIR}/sdk/DATASYSTEM_SYM" - fi - if is_on "${PACKAGE_PYTHON}"; then - cp ${BUILD_DIR}/python_lib/*.sym "${INSTALL_DIR}/sdk/DATASYSTEM_SYM" - fi - strip_symbols "${INSTALL_DIR}/service" "${INSTALL_DIR}/service/DATASYSTEM_SYM" - strip_symbols "${INSTALL_DIR}/service/lib" "${INSTALL_DIR}/service/DATASYSTEM_SYM" - fi - - # build example if -t is build or run - if is_on "${BUILD_TESTCASE}"; then - baseTime_s=$(date +%s) - build_example - echo -e "---- [TIMER] Build example: $(($(date +%s)-$baseTime_s)) seconds" - fi - - # package - cd "${INSTALL_DIR}" - tar --remove-files -zcf yr-datasystem-v$(cat "${BASE_DIR}/VERSION").tar.gz service sdk - cd - - echo -e "-- build datasystem success!" -} - -function main() { - if [[ x"$1" == "xclean" ]]; then - clean_dirs - exit 0 - fi - init_default_opts - set_datasystem_version - local logical_cpu_cout - logical_cpu_cout=$(cat /proc/cpuinfo | grep "processor" | wc -l) - if [[ "${logical_cpu_cout}" == "0" ]]; then - echo "Can't get logical cpu count, set to default 16" - logical_cpu_cout=16 - fi - while getopts 'hdro:j:t:u:c:e:p:s:l:i:n:B:F:S:P:T:X:R:D:C:M:x:m:' OPT; do - case "${OPT}" in - d) - BUILD_TYPE="Debug" - ;; - r) - BUILD_TYPE="Release" - ;; - o) - INSTALL_DIR=$(realpath -m "${OPTARG}") - ;; - B) - BUILD_DIR=$(realpath -m "${OPTARG}") - ;; - t) - if [[ "X${OPTARG}" != "Xoff" && "X${OPTARG}" != "Xbuild" && "X${OPTARG}" != "Xrun" && "X${OPTARG}" != "Xrun_except_cpp" && - "X${OPTARG}" != "Xrun_cases" && "X${OPTARG}" != "Xrun_cpp" && "X${OPTARG}" != "Xrun_python" && - "X${OPTARG}" != "Xrun_example" ]]; then - echo -e "Invalid value ${OPTARG} for option -t" - echo -e "${USAGE}" - exit 1 - fi - RUN_TESTS="${OPTARG}" - ;; - j) - check_number "${OPTARG}" j - BUILD_THREAD_NUM="${OPTARG}" - if [ ${OPTARG} -gt $logical_cpu_cout ]; then - echo -e "-- [Warning] The -j $BUILD_THREAD_NUM is over the max logical cpu count($logical_cpu_cout), set BUILD_THREAD_NUM to ($logical_cpu_cout)." - BUILD_THREAD_NUM="$logical_cpu_cout" - fi - ;; - u) - check_number "${OPTARG}" u - TEST_PARALLEL_JOBS="${OPTARG}" - if [ ${OPTARG} -gt $logical_cpu_cout ]; then - echo -e "-- [Warning] The -u $TEST_PARALLEL_JOBS is over the max logical cpu count($logical_cpu_cout), set TEST_PARALLEL_JOBS to ($logical_cpu_cout)." - TEST_PARALLEL_JOBS="$logical_cpu_cout" - fi - ;; - c) - if [ "${OPTARG}" == "off" ]; then - echo -e "Do not compile coverage reports." - elif [ "${OPTARG}" == "on" ]; then - BUILD_COVERAGE="on" - elif [ "${OPTARG}" == "html" ]; then - BUILD_COVERAGE="on" - GEN_HTML_COVERAGE="on" - else - echo -e "Invalid value ${OPTARG} for option -c, choose from off/on/html" - echo -e "${USAGE}" - exit 1 - fi - ;; - s) - check_on_off "${OPTARG}" s - ENABLE_STRIP=${OPTARG} - ;; - F) - echo "Should not set -F on" - ;; - S) - check_sanitizers "${OPTARG}" S - USE_SANITIZER="${OPTARG}" - ;; - P) - if [ "${OPTARG}" == "off" ] || [ "${OPTARG}" == "on" ]; then - PACKAGE_PYTHON="${OPTARG}" - PYTHON_ROOT_DIR="" - elif [[ -d "${OPTARG}" ]]; then - PACKAGE_PYTHON="on" - PYTHON_ROOT_DIR="${OPTARG}" - else - echo -e "Invalid value ${OPTARG} for option -P, choose from off, on or . If specifying , ensure the path exists." - echo -e "${USAGE}" - exit 1 - fi - ;; - p) - check_on_off "${OPTARG}" p - ENABLE_PERF="${OPTARG}" - ;; - T) - parse_thirdparty_versions "${OPTARG}" - ;; - M) - check_on_off "${OPTARG}" M - BUILD_WITH_URMA="${OPTARG}" - ;; - - D) - parse_ub_download_options ${OPTARG} - ;; - h) - echo -e "${USAGE}" - exit 0 - ;; - X) - check_on_off "${OPTARG}" X - BUILD_HETERO="${OPTARG}" - ;; - l) - check_labels "${OPTARG}" l - LLT_LABELS=${OPTARG} - ;; - i) - check_on_off "${OPTARG}" i - BUILD_INCREMENT=${OPTARG} - ;; - n) - check_on_off "${OPTARG}" n - BUILD_WITH_NINJA=${OPTARG} - ;; - x) - check_on_off "${OPTARG}" x - SUPPORT_JEPROF=${OPTARG} - ;; - m) - check_number "${OPTARG}" m - LLT_TIMEOUT_S=${OPTARG} - ;; - ?) - echo -e "${USAGE}" - exit 1 - ;; - esac - done - - shift $(($OPTIND - 1)) - if [[ -n "$1" ]]; then - echo -e "Invalid parameter $1" - echo -e "${USAGE}" - exit 1 - fi - - local start_time_s - local end_time_s - local sumTime - start_time_s=$(date +%s) - - if [[ "${RUN_TESTS}" == "off" || "${RUN_TESTS}" == "build" || "${RUN_TESTS}" == "run" ]]; then - build_datasystem - fi - - run_testcases - - end_time_s=$(date +%s) - sumTime=$(($end_time_s - $start_time_s)) - echo -e "---- [TIMER] Total use time: $sumTime seconds" - - exit 0 -} - -main "$@" diff --git a/check_tools.sh b/check_tools.sh deleted file mode 100644 index 34298e572d95da0a0fbc88fc1f1ff644cdee0a2a..0000000000000000000000000000000000000000 --- a/check_tools.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash - -check_tool() { - local cmd="$1" - local version_cmd="$2" - local name="$3" - local version="NOT INSTALLED" - - if command -v "$cmd" &> /dev/null; then - if [ -n "$version_cmd" ]; then - version=$(eval "$version_cmd" 2>&1 | head -n1) - else - case "$name" in - "Java") - version=$(java -version 2>&1 | head -n1 | cut -d'"' -f2) - ;; - "protoc") - version=$(protoc --version 2>&1 | awk '{print $2}') - ;; - "Python 3.9") - version=$(python3.9 --version 2>&1 | awk '{print $2}') - ;; - "Python 3.10") - version=$(python3.10 --version 2>&1 | awk '{print $2}') - ;; - "Python 3.11") - version=$(python3.11 --version 2>&1 | awk '{print $2}') - ;; - "glibc") - version=$(ldd --version 2>&1 | head -n1 | awk '{print $NF}') - ;; - "Ninja") - version="OK (via ninja-build)" - ;; - *) - version="OK" - ;; - esac - fi - fi - printf "%-20s %s\n" "$name" "$version" -} - -check_tools() { - local all_ok=true - - echo "==========================================" - printf "%-20s %s\n" "Tool" "Version" - echo "------------------------------------------" - - check_tool java "" "Java" - check_tool mvn "mvn -version 2>&1 | grep 'Apache Maven' | awk '{print \$3}'" "Maven" - check_tool go "go version 2>&1 | awk '{print \$3}'" "Go" - check_tool bazel "bazel --version 2>&1 | grep -o 'bazel [0-9.]*' | awk '{print \$2}'" "Bazel" - check_tool python3.9 "" "Python 3.9" - check_tool python3.10 "" "Python 3.10" - check_tool python3.11 "" "Python 3.11" - check_tool ninja "" "Ninja" - check_tool protoc "" "protoc" - check_tool cmake "cmake --version 2>&1 | head -n1 | awk '{print \$3}'" "CMake" - check_tool gcc "gcc --version 2>&1 | head -n1 | awk '{print \$3}'" "GCC" - check_tool ldd "" "glibc" - check_tool doxygen "doxygen --version" "Doxygen" - - echo "==========================================" - - local cmd - local tools=( - "java" - "mvn" - "go" - "bazel" - "python3.9" - "python3.10" - "python3.11" - "ninja" - "protoc" - "cmake" - "gcc" - "ldd" - "doxygen" - ) - - for cmd in "${tools[@]}"; do - if ! command -v "$cmd" &> /dev/null; then - all_ok=false - break - fi - done - - if $all_ok; then - return 0 - else - return 1 - fi -} \ No newline at end of file diff --git a/cli/__init__.py b/cli/__init__.py deleted file mode 100644 index d2a5f0c0eeee8e1db246567bd7ec5b16efabd4d8..0000000000000000000000000000000000000000 --- a/cli/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI init module.""" - -import importlib.metadata - - -__all__ = [ - '__version__', -] - -__version__ = importlib.metadata.version("openyuanrong-datasystem") diff --git a/cli/collect_log.py b/cli/collect_log.py deleted file mode 100644 index ab3628d800eb1bb37ce98daf1ae0582fa1abe5a7..0000000000000000000000000000000000000000 --- a/cli/collect_log.py +++ /dev/null @@ -1,125 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI collect_log command.""" - - -import os -from datetime import datetime, timezone - -import datasystem.cli.common.util as util -from datasystem.cli.command import BaseCommand -from datasystem.cli.common.constant import ClusterConfig -from datasystem.cli.common.parallel import ParallelMixin - - -class Command(BaseCommand, ParallelMixin): - """ - Collect logs on cluster nodes. - """ - - name = "collect_log" - description = "collect logs on cluster nodes" - - _config = {} - _remote_log_path = "" - _output_dir = "" - - @staticmethod - def add_arguments(parser): - """Add arguments to parser. - - Args: - parser (ArgumentParser): Specify parser to which arguments are added. - """ - parser.add_argument( - "-f", - "--cluster_config_path", - metavar="FILE", - required=True, - help="path of cluster configuration file (JSON format)", - ) - parser.add_argument( - "-d", - "--log_path", - metavar="PATH", - required=True, - help="remote path to the logs directory on each cluster node that needs to be collected", - ) - parser.add_argument( - "-o", - "--output_path", - default=f"log_{datetime.now(tz=timezone.utc).strftime('%Y%m%d_%H%M%S')}", - help="local directory path where collected logs will be stored, " - "defaults to 'log_' in the current directory", - ) - - def run(self, args): - """Execute for collect_log command. - - Args: - args (Namespace): Parsed arguments to hold customized parameters. - - Returns: - int: Exit code, 0 for success, 1 for failure. - """ - try: - self._config = util.load_cluster_config( - args.cluster_config_path, - [ - ClusterConfig.WORKER_NODES, - ClusterConfig.SSH_USER_NAME, - ClusterConfig.SSH_PRIVATE_KEY, - ], - ) - self._config[ClusterConfig.SSH_PRIVATE_KEY] = os.path.realpath( - os.path.expanduser(self._config[ClusterConfig.SSH_PRIVATE_KEY]) - ) - - self._remote_log_path = args.log_path - - self._output_dir = os.path.realpath(args.output_path) - os.makedirs(self._output_dir, exist_ok=True) - - self.execute_parallel(self._config[ClusterConfig.WORKER_NODES]) - except Exception as e: - self.logger.error(f"Collect log failed: {e}") - return self.FAILURE - return self.SUCCESS - - def process_node(self, node): - """Collect logs from a single cluster node. - - Args: - node (str): The IP address of the worker node. - - Raises: - RuntimeError: If log collection from the node fails. - """ - try: - user_name = self._config[ClusterConfig.SSH_USER_NAME] - private_key = self._config[ClusterConfig.SSH_PRIVATE_KEY] - local_path = os.path.normpath(os.path.join(self._output_dir, str(node))) - local_path = util.valid_safe_path(local_path) - node = util.is_valid_ipv4(node) - - util.scp_download( - node, - self._remote_log_path, - local_path, - user_name, - private_key, - ) - self.logger.info(f"Collect logs from {node} successfully.") - except Exception as e: - raise RuntimeError(f"Failed to collect logs from {node}: {e}") from e diff --git a/cli/command.py b/cli/command.py deleted file mode 100644 index 061ecc1f592c4727969ae356ecb96eed183c5cc1..0000000000000000000000000000000000000000 --- a/cli/command.py +++ /dev/null @@ -1,164 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI command module.""" - -import argparse -import logging -import os -import stat -import sys -from importlib import import_module - -import importlib.resources as resources - -from . import __version__ - - -class BaseCommand: - """Base command class.""" - - name = "" - description = "" - - logger = None - - SUCCESS = 0 - FAILURE = 1 - - def __init__(self): - """Initialize of command""" - - def valid_safe_path(path: str): - unsafe_dirs = ["/bin", "/sbin", "/lib", "/lib64", "/", "/boot", "/dev", "/etc", "/sys", "/proc"] - norm_path = os.path.normpath(os.path.abspath(path)) - if norm_path in unsafe_dirs: - raise ValueError(f"Path {path} is outside allowed directory") - for parent in unsafe_dirs: - if parent == "/": - continue - if norm_path.startswith(parent + os.sep): - raise ValueError(f"Path {path} is outside allowed directory") - return norm_path - - if BaseCommand.logger is None: - BaseCommand._configure_logging() - self._base_dir = str(resources.files("datasystem")) - self._base_dir = valid_safe_path(self._base_dir) - - @staticmethod - def add_arguments(parser): - """ - Add arguments to parser. - - Args: - parser (ArgumentParser): specify parser to which arguments are added. - """ - - @classmethod - def _configure_logging(cls): - """Configure logging format and handlers.""" - if cls.logger is not None: - return - - cls.logger = logging.getLogger("dscli") - formatter = logging.Formatter("[%(levelname)s] %(message)s") - - # Console handler (shows INFO and above) - console_handler = logging.StreamHandler() - console_handler.setLevel(logging.INFO) - console_handler.setFormatter(formatter) - - cls.logger.setLevel(logging.INFO) - cls.logger.addHandler(console_handler) - - def run(self, args): - """ - Implementation of command logic. - - Args: - args (Namespace): parsed arguments to hold customized parameters. - """ - raise NotImplementedError( - "subclasses of BaseCommand must provide a run() method" - ) - - def invoke(self, args): - """ - Invocation of command. - - Args: - args (Namespace): parsed arguments to hold customized parameters. - """ - return self.run(args) - - -def main(): - """Entry point for YuanRong datasystem CLI.""" - if (sys.version_info.major, sys.version_info.minor) < (3, 8): - logging.error("Python version should be at least 3.8") - sys.exit(1) - - # set umask to 0o077 - os.umask(stat.S_IRWXG | stat.S_IRWXO) - - parser = argparse.ArgumentParser( - prog="dscli", - description="YuanRong datasystem CLI entry point (version: {})".format( - __version__ - ), - allow_abbrev=False, - ) - - parser.add_argument( - "--version", action="version", version="%(prog)s ({})".format(__version__) - ) - - subparsers = parser.add_subparsers( - dest="cli", - title="subcommands", - description="the following subcommands are supported", - ) - - commands = {} - modules = [ - "start", - "stop", - "up", - "down", - "runscript", - "generate_helm_chart", - "generate_cpp_template", - "generate_config", - "collect_log", - ] - for m in modules: - module = import_module(f"datasystem.cli.{m}") - command_cls = getattr(module, "Command", None) - if command_cls is None or not issubclass(command_cls, BaseCommand): - continue - - command = command_cls() - command_parser = subparsers.add_parser( - command.name, help=command.description, allow_abbrev=False - ) - command.add_arguments(command_parser) - commands[command.name] = command - argv = sys.argv[1:] - if not argv or argv[0] == "help": - argv = ["-h"] - args = parser.parse_args(argv) - cli = args.__dict__.pop("cli") - command = commands[cli] - if command.invoke(args) != BaseCommand.SUCCESS: - sys.exit(1) diff --git a/cli/common/__init__.py b/cli/common/__init__.py deleted file mode 100644 index 15b64ca93aa079c545ef3de742572334d86c0ab3..0000000000000000000000000000000000000000 --- a/cli/common/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI common module.""" diff --git a/cli/common/constant.py b/cli/common/constant.py deleted file mode 100644 index 0514a641c111f778722ed83965f9cc278da82547..0000000000000000000000000000000000000000 --- a/cli/common/constant.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI constant module.""" - -from enum import Enum - - -class ClusterConfig(Enum): - SSH_USER_NAME = "ssh_auth.ssh_user_name" - SSH_PRIVATE_KEY = "ssh_auth.ssh_private_key" - WORKER_CONFIG_PATH = "worker_config_path" - WORKER_NODES = "worker_nodes" - WORKER_PORT = "worker_port" diff --git a/cli/common/parallel.py b/cli/common/parallel.py deleted file mode 100644 index aafaf591d5e8e907fbf2fa8f11c8001e786a83d9..0000000000000000000000000000000000000000 --- a/cli/common/parallel.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI parallel module.""" - -from concurrent.futures import ThreadPoolExecutor, as_completed - - -class ParallelMixin: - """Mixin to run tasks in parallel across nodes.""" - - def execute_parallel(self, nodes): - """Execute tasks on all nodes in parallel.""" - if not hasattr(self, "process_node"): - raise NotImplementedError( - "Class must implement process_node() to use execute_parallel" - ) - is_error = False - - with ThreadPoolExecutor(max_workers=len(nodes)) as executor: - futures = {executor.submit(self.process_node, node): node for node in nodes} - - for future in as_completed(futures): - node = futures[future] - try: - future.result() - except Exception as e: - is_error = True - self.logger.error(f"Node {node} execute failed: {e}") - - if is_error: - raise RuntimeError("Some nodes failed during processing") diff --git a/cli/common/util.py b/cli/common/util.py deleted file mode 100644 index cec12b05d4104778a0a2a11a32070564c6df8b53..0000000000000000000000000000000000000000 --- a/cli/common/util.py +++ /dev/null @@ -1,321 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI util module.""" - -import ipaddress -import json -import os -import re -import subprocess -from datetime import datetime, timezone -from typing import Any, Dict, List, Optional - -from datasystem.cli.common.constant import ClusterConfig - -DANGER = re.compile(r'''[;&|`$()<>{}[\]!*?\n\t\r\x0b\x0c'"\\]''') -UNSAFE = ["/bin", "/sbin", "/lib", "/lib64", "/", - "/boot", "/dev", "/etc", "/sys", "/proc"] - - -def valid_safe_path(path: str): - """ - Validate the path is safe. - - Args: - path: Input path. - - Raises: - ValueError: If input contains potential command-injection characters. - """ - norm_path = os.path.normpath(os.path.abspath(path)) - if "../" in norm_path: - raise ValueError(f"Path {path} contains directory traversal sequences (e.g., ../)") - if norm_path in UNSAFE: - raise ValueError(f"Path {path} is outside allowed directory") - for parent in UNSAFE: - if parent == "/": - continue - if norm_path.startswith(parent + os.sep): - raise ValueError(f"Path {path} is outside allowed directory") - return norm_path - - -def is_valid_ipv4(addr: str): - """ - Validate the addr is valid IPV4 address. - - Args: - addr: IP address - - Raises: - ValueError: If input contains potential command-injection characters. - """ - try: - ipaddress.IPv4Address(addr) - except ipaddress.AddressValueError as e: - raise ValueError(f"Invalid address {addr}") from e - - -def is_valid_port(port): - """ - Validate the port is valid IPV4 port. - - Args: - port: IP port - - Raises: - ValueError: If input contains potential command-injection characters. - """ - port = int(port) - if port < 0 or port > 65535: - raise ValueError(f"port {port} is not in valid range") - - -def is_valid_address_port(addr_port: str): - """ - Validate the addr_port is valid IPV4 address with port. - - Args: - addr_port: IP address with port - - Raises: - ValueError: If input contains potential command-injection characters. - """ - try: - addr, port = addr_port.split(':') - except ValueError as e: - raise ValueError(f"Invalid address:port {addr_port}") from e - - is_valid_ipv4(addr) - is_valid_port(port) - - -def validate_no_injection(user_input: str) -> str: - """ - Validate the user input is no command injection. - - Args: - user_input: user input - - Raises: - ValueError: If input contains potential command-injection characters. - """ - if not isinstance(user_input, str): - return user_input - if DANGER.search(user_input): - raise ValueError("Input contains potential command-injection characters") - return user_input - - -def get_required_config(config, key): - """Get a required configuration value from a dictionary. - - Args: - config: The configuration dictionary. - key: The key to retrieve from the dictionary. - - Raises: - ValueError: If the key is not found in the configuration. - """ - value = config.get(key) - if value is None: - raise ValueError(f"{key} not found in config") - return value - - -def load_cluster_config( - path: str, keys: Optional[List[ClusterConfig]] = None -) -> Dict[str, str]: - """Load cluster configuration from a JSON file and extract specific keys. - - Args: - path: Path to the JSON configuration file. - keys: Optional list of ClusterConfig keys to extract. If None, all keys are used. - - Returns: - A dictionary containing the extracted configuration values. - - Raises: - ValueError: If the configuration file format is incorrect. - """ - try: - path = os.path.abspath(path) - with open(path) as f: - config = json.load(f) - except json.JSONDecodeError as e: - raise ValueError(f"The configuration file {path} format is incorrect.") from e - - if keys is None: - keys = list(ClusterConfig) - - result = {} - for key in keys: - keys_list = key.value.split(".") - value = config - for k in keys_list: - value = get_required_config(value, k) - result[key] = value - return result - - -def ssh_execute(host, username, private_key, command): - """Execute a command on a remote host via SSH. - - Args: - host: The remote host to connect to. - username: The username for SSH authentication. - private_key: Path to the private key for SSH authentication. - command: The command to execute on the remote host. - - Returns: - The output of the executed command. - - Raises: - RuntimeError: If the SSH connection fails or the command execution fails. - """ - ssh_command = ["ssh", "-q", "-i", private_key, f"{username}@{host}", command] - try: - process = subprocess.Popen( - ssh_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE - ) - stdout, stderr = process.communicate(timeout=300) - if process.returncode != 0: - raise RuntimeError( - f"Error executing on {host} (exit code {process.returncode}): {stderr.decode()}" - ) - return stdout.decode() - except Exception as e: - raise RuntimeError(f"SSH connection to {host} failed: {e}") from e - - -def scp_upload(local_file, remote_host, remote_path, user_name, private_key): - """Upload a file to a remote host via SCP. - - Args: - local_file: Path to the local file to upload. - remote_host: The remote host to upload the file to. - remote_path: The destination path on the remote host. - user_name: The username for SCP authentication. - private_key: Path to the private key for SCP authentication. - - Raises: - RuntimeError: If the file upload fails. - """ - remote_path = os.path.normpath(remote_path) - - if "../" in remote_path: - raise ValueError(f"Remote path {remote_path} contains directory traversal sequences (e.g., ../)") - - if remote_path in UNSAFE: - raise ValueError(f"Remote path {remote_path} is outside allowed directory") - - scp_command = [ - "scp", - "-i", - private_key, - local_file, - f"{user_name}@{remote_host}:{remote_path}", - ] - try: - subprocess.check_call(scp_command, stdout=subprocess.DEVNULL) - except subprocess.CalledProcessError as e: - raise RuntimeError(f"Failed to upload file to {remote_host}: {e}") from e - - -def scp_download(remote_host, remote_path, local_path, user_name, private_key): - """Download a file/directory from a remote host via SCP. - - Args: - remote_host: The remote host IP or hostname. - remote_path: The source path on the remote host. - local_path: The destination path on local machine. - user_name: The username for SCP authentication. - private_key: Path to the private key for SCP authentication. - - Raises: - RuntimeError: If the file download fails. - """ - os.makedirs(local_path, exist_ok=True) - scp_command = [ - "scp", - "-r", - "-i", - private_key, - f"{user_name}@{remote_host}:{remote_path}", - local_path, - ] - try: - subprocess.check_call(scp_command, stdout=subprocess.DEVNULL) - except subprocess.CalledProcessError as e: - raise RuntimeError(f"Failed to download from {remote_host}: {e}") from e - - -def get_timestamped_path(original_path: str) -> str: - """ - Generate a timestamped version of the given path if it starts with "./yr_datasystem". - - Args: - original_path (str): The original path string to process. - - Returns: - str: The modified path with a timestamp appended if it starts with "./yr_datasystem", - otherwise returns the original path. - """ - if original_path.startswith("./yr_datasystem"): - return original_path.replace( - "./yr_datasystem", - f"./yr_datasystem{datetime.now(tz=timezone.utc).strftime('%Y%m%d%H%M%S')}", - 1, - ) - return original_path - - -def compare_and_process_config( - home_dir: str, config: Dict[str, Any], default_config: Dict[str, Any] -) -> Dict[str, Any]: - """ - Compare and process the user configuration with the default configuration. - - Args: - home_dir (str): The home directory path used to resolve relative paths. - config (Dict[str, Any]): The user configuration dictionary to be processed. - default_config (Dict[str, Any]): The default configuration dictionary for comparison. - - Returns: - Dict[str, Any]: A dictionary containing only the keys that were modified by the user. - """ - modified = {} - for key, item in default_config.items(): - default_value = str(item.get("value", "")) - user_item = config.setdefault(key, {}) - user_value = str(user_item.get("value", "")) - - is_modified = user_value.strip() and str(default_value) != str(user_value) - if is_modified: - modified[key] = user_value - else: - user_item["value"] = default_value - user_value = default_value - - if user_value.startswith("./"): - if "../" in user_value: - raise RuntimeError(f"Invalid path in config value: {user_value}") - if home_dir: - user_item["value"] = os.path.join(home_dir, user_value[2:]) - elif is_modified: - user_item["value"] = os.path.realpath(user_value) - else: - user_item["value"] = os.path.realpath(get_timestamped_path(user_value)) - - return modified diff --git a/cli/deploy/conf/cluster_config.json b/cli/deploy/conf/cluster_config.json deleted file mode 100644 index d9f8612df4f39ec330bb274e15e0a925ba9aa766..0000000000000000000000000000000000000000 --- a/cli/deploy/conf/cluster_config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "ssh_auth": { - "ssh_private_key": "~/.ssh/id_rsa", - "ssh_user_name": "root" - }, - "worker_config_path": "./worker_config.json", - "worker_nodes": [ - "127.0.0.1" - ], - "worker_port": 31501 -} \ No newline at end of file diff --git a/cli/deploy/conf/worker_config.json b/cli/deploy/conf/worker_config.json deleted file mode 100644 index 3d41f98ae524a22d04c122c0c3c1ae74442a482f..0000000000000000000000000000000000000000 --- a/cli/deploy/conf/worker_config.json +++ /dev/null @@ -1,406 +0,0 @@ -{ - "worker_address": { - "value": "127.0.0.1:31501", - "description": "Address of worker in 'host:port' format (e.g., \"127.0.0.1:31501\"). The value cannot be empty." - }, - "etcd_address": { - "value": "", - "description": "Address of ETCD server, (such as \"192.168.0.1:10001,192.168.0.2:10001,192.168.0.3:10001\")." - }, - "shared_memory_size_mb": { - "value": "1024", - "description": "Upper limit of the shared memory, the unit is mb, must be greater than 0." - }, - "oc_shm_threshold_percentage": { - "value": "100", - "description": "Upper limit of the shared memory in percentage can be used by OC, must be within (0, 100]" - }, - "heartbeat_interval_ms": { - "value": "1000", - "description": "Time interval between worker and etcd heartbeats." - }, - "authorization_enable": { - "value": "false", - "description": "Indicates whether to enable the tenant authentication, default is false." - }, - "ipc_through_shared_memory": { - "value": "true", - "description": "Using shared memory to exchange data between client and worker. If this parameter is set to true, client and worker will pass control messages through Unix Domain Sockets (UDS); otherwise, they will pass control messages through TCP/IP and exchange data through TCP/IP." - }, - "unix_domain_socket_dir": { - "value": "./datasystem/uds", - "description": "The directory to store unix domain socket file. The UDS generates temporary files in this path. Max length: 80" - }, - "az_name": { - "value": "", - "description": "az_name is typically used in scenarios where multiple AZ datasystem share a single etcd cluster, allowing different clusters to be distinguished by the az_name." - }, - "other_az_names": { - "value": "", - "description": "Specify other az names using the same etcd. Split by ','" - }, - "oc_io_from_l2cache_need_metadata": { - "value": "true", - "description": "Control whether data read and write from the L2 cache daemon depend on metadata. Note: If set to false, it indicates that the metadata is not stored in etcd." - }, - "enable_distributed_master": { - "value": "true", - "description": "Whether to support distributed master, default is true." - }, - "oc_worker_worker_direct_port": { - "value": "0", - "description": "A direct tcp/ip port for worker to workers scenarios to improve latency. Acceptable values:0 or a positive integer. 0 indicates disabled." - }, - "oc_worker_worker_pool_size": { - "value": "3", - "description": "Number of parallel connections between worker/worker oc service. The flag `oc_worker_worker_direct_port` must be enabled for this setting to take effect" - }, - "payload_nocopy_threshold": { - "value": "104857600", - "description": "minimum payload size to trigger no memory copy" - }, - "oc_thread_num": { - "value": "32", - "description": "The number of worker service for object cache, default is 32." - }, - "eviction_thread_num": { - "value": "1", - "description": "Thread number of eviction for object cache." - }, - "eviction_reserve_mem_threshold_mb": { - "value": "10240", - "description": "The reserved memory (MB) is determined by min(shared_memory_size_mb*0.2, eviction_reserve_mem_threshold_mb). Eviction begins when memory drops below this threshold.The valid range is 100-102400." - }, - "client_reconnect_wait_s": { - "value": "5", - "description": "Client reconnect wait seconds, default is 5." - }, - "etcd_meta_pool_size": { - "value": "8", - "description": "ETCD metadata async pool size." - }, - "spill_directory": { - "value": "", - "description": "The path and file name prefix of the spilling, empty means spill disabled." - }, - "spill_size_limit": { - "value": 0, - "description": "Maximum amount of spilled data that can be stored in the spill directory. If spill is enable and spill_size_limit is 0, spill_size_limit will be set to 95% of the spill directory." - }, - "spill_thread_num": { - "value": "8", - "description": "It represents the maximum parallelism of writing files, more threads will consume more CPU and I/O resources." - }, - "spill_file_max_size_mb": { - "value": "200", - "description": "The size limit of single spill file, spilling objects which lager than that value with one object per file. If there are some big objects, you can increase this value to avoid run out of inodes quickly. The valid range is 200-10240." - }, - "spill_file_open_limit": { - "value": "512", - "description": "The maximum number of open file descriptors about spill. If opened file exceed this value, some files will be temporarily closed to prevent exceeding the maximum system limit. You need reduce this value if your system resources are limited. The valid range is greater than or equal to 8." - }, - "spill_enable_readahead": { - "value": "true", - "description": "Disable readahead can mitigate the read amplification problem for offset read, default is true" - }, - "log_monitor": { - "value": "true", - "description": "Record performance and resource logs." - }, - "log_monitor_exporter": { - "value": "harddisk", - "description": "Specify the type of exporter, either harddisk or backend. Only takes effect when log_monitor is true." - }, - "log_monitor_interval_ms": { - "value": "10000", - "description": "The sleep time between iterations of observability collector scan, default value is 10000ms(Must be greater than 0)." - }, - "system_access_key": { - "value": "", - "description": "The access key for system component AK/SK authentication." - }, - "system_secret_key": { - "value": "", - "description": "The secret key for system component AK/SK authentication." - }, - "system_data_key": { - "value": "", - "description": "The data key for system to decrypt sensitive data. The length of encrypted datakey should be 32" - }, - "tenant_access_key": { - "value": "", - "description": "The access key for tenant AK/SK authentication." - }, - "tenant_secret_key": { - "value": "", - "description": "The secret key for tenant AK/SK authentication." - }, - "request_expire_time_s": { - "value": "300", - "description": "When AK/SK authentication is used, if the duration from the client to the server is longer than this parameter, the authentication fails and the service is denied." - }, - "max_client_num": { - "value": "200", - "description": "Maximum number of clients that can be connected to a worker. Value range: [1, 10000]." - }, - "l2_cache_type": { - "value": "none", - "description": "Config the l2 cache type, obs. Optional value: 'obs', 'sfs', 'none'" - }, - "l2_cache_delete_thread_num": { - "value": "32", - "description": "L2 cache delete thread number, increasing this value can improve the parallelism of deletion, but it will also increase the CPU consumption of the worker." - }, - "object_del_retry_delay_sec": { - "value": "3600", - "description": "when we delete the object which is in uploading process, in this scenarios we need delay some time to retry." - }, - "cache_rpc_session": { - "value": "true", - "description": "Deprecated: This flag is deprecated and will be removed in future releases." - }, - "rocksdb_store_dir": { - "value": "./datasystem/rocksdb", - "description": "Config MASTER back store directory and must specify in rocksdb scenario. The rocksdb database is used to persistently store the metadata stored in the master so that the metadata before the restart can be re-obtained when the master restarts." - }, - "rocksdb_sync_write": { - "value": "false", - "description": "Controls whether rocksdb sets sync to true when writing data." - }, - "rocksdb_max_open_file": { - "value": "128", - "description": "Number of open files that can be used by the rocksdb, default value is 128." - }, - "rocksdb_background_threads": { - "value": "16", - "description": "Number of background threads rocksdb can use for flushing and compacting, default value is 16(Should be greater than 0)." - }, - "node_timeout_s": { - "value": "60", - "description": "Maximum time interval before a node is considered lost." - }, - "node_dead_timeout_s": { - "value": "300", - "description": "Maximum time interval for the etcd to determine node death." - }, - "arena_per_tenant": { - "value": "16", - "description": "The arena count for each tenant. Multiple arenas can improve the performance of share memory allocation for the first time, but each arena will use one more fd." - }, - "shared_memory_populate": { - "value": "false", - "description": "Avoiding page faults during copying improves runtime performance but may result in longer worker startup times (depending on shared_memory_size_mb)." - }, - "memory_reclamation_time_second": { - "value": "600", - "description": "The memory reclamation time after free." - }, - "async_delete": { - "value": "false", - "description": "Master notify workers to delete objects asynchronously." - }, - "add_node_wait_time_s": { - "value": "60", - "description": "Time to wait for the first node that wants to join a working hash ring." - }, - "auto_del_dead_node": { - "value": "true", - "description": "Decide whether to remove the node from hash ring or not when node is dead" - }, - "enable_hash_ring_self_healing": { - "value": "false", - "description": "Whether to support self-healing when the hash ring is in an abnormal state, default is false." - }, - "client_dead_timeout_s": { - "value": "120", - "description": "Maximum time interval for the worker to determine client death, Value range: [15, UINT64_MAX)." - }, - "monitor_config_file": { - "value": "./datasystem/config/datasystem.config", - "description": "Configure the path of the worker monitoring configuration file. During the execution of the worker, it periodically monitors whether the configuration file is changed to update the flag parameter value." - }, - "loglevel_only_for_workers": { - "value": "", - "description": "The log level can be configured to take effect only for specified workers, such as (-loglevel_only_for_workers=192.168.0.1,192.168.0.2). If this parameter is left blank, the parameter takes effect for all workers." - }, - "enable_thp": { - "value": "false", - "description": "Control this process by enabling transparent huge pages, default is disabled. Enable Transparent Huge Pages (THP) can enhance performance and reduce page table overhead, but it may also lead to increased memory usage" - }, - "cross_az_get_data_from_worker": { - "value": "true", - "description": "Control whether try to get data from other AZ's worker firstly, if false then get data from L2 cache directly." - }, - "cross_az_get_meta_from_worker": { - "value": "false", - "description": "Control whether get meta data from other AZ's worker, if false then get meta data from local AZ." - }, - "enable_worker_worker_batch_get": { - "value" : "false", - "description" : "Enable worker->worker OC batch get, default false." - }, - "batch_get_threshold_mb": { - "value" : "100", - "description": "The payload threshold to batch get objects, the unit is mb, must be greater than 0. Setting to 0 will indicate no split." - }, - "enable_reconciliation": { - "value": "true", - "description": "Whether to enable reconciliation, default is true." - }, - "data_migrate_rate_limit_mb": { - "value": "40", - "description": "Data migrate rate limit for every node when scale down happen." - }, - "check_async_queue_empty_time_s": { - "value": "15", - "description": "The worker ensures a certain period of time that the asynchronous queues for sending messages to ETCD and L2 cache remain empty before it can exit properly." - }, - "obs_access_key": { - "value": "", - "description": "Pass in access key for authentication when connecting to OBS." - }, - "obs_secret_key": { - "value": "", - "description": "Pass in secret key for authentication when connecting to OBS." - }, - "obs_endpoint": { - "value": "", - "description": "OBS address." - }, - "obs_bucket": { - "value": "", - "description": "Name of OBS bucket to use. Can use only one bucket" - }, - "obs_https_enabled": { - "value": "false", - "description": "Whether to enable the https in obs. false: use HTTP (default), true: use HTTPS" - }, - "sfs_path": { - "value": "", - "description": "The path to the mounted SFS." - }, - "health_check_path": { - "value": "./datasystem/probe/healthy", - "description": "File will create after the worker successfully." - }, - "ready_check_path": { - "value": "./datasystem/probe/ready", - "description": "This file will be created after the worker service is started successfully and a connection can be established using the stub." - }, - "rpc_thread_num": { - "value": "16", - "description": "Config rpc server thread number, must be great equal than 0." - }, - "minloglevel": { - "value": "0", - "description": "Messages logged at a lower level than this don't actually get logged anywhere." - }, - "log_dir": { - "value": "./datasystem/logs", - "description": "The directory where log files are stored." - }, - "log_filename": { - "value": "", - "description": "Prefix of log filename, default is program invocation short name. Use standard characters only." - }, - "log_async_queue_size": { - "value": "65536", - "description": "Size of async logger's message queue." - }, - "max_log_size": { - "value": "400", - "description": "Maximum log file size (in MB), must be greater than 0." - }, - "max_log_file_num": { - "value": "5", - "description": "Maximum number of log files to retain per severity level. And every log file size is limited by max_log_size." - }, - "log_retention_day": { - "value": "0", - "description": "This value should be greater than or equal to 0.If log_retention_day is greater than 0, any log file from your project whose last modified time is greater than log_retention_day days will be unlinked. If log_retention_day is equal 0, will not unlink log file by time." - }, - "log_async": { - "value": "true", - "description": "Flush log files with async mode." - }, - "log_compress": { - "value": "true", - "description": "Compress old log files in .gz format. This parameter takes effect only when the size of the generated log is greater than max log size." - }, - "logbufsecs": { - "value": "10", - "description": "Buffer log messages for at most this many seconds." - }, - "v": { - "value": "0", - "description": "Vlog level, a larger value indicates more detailed logs. The value is between 0-3." - }, - "enable_curve_zmq": { - "value": "false", - "description": "Whether to enable Curve ZMQ for authentication and authorization between components." - }, - "zmq_server_io_context": { - "value": "5", - "description": "Optimize the performance of the customer. Default server 5. The higher the throughput, the higher the value, but should be in range [1, 32]." - }, - "zmq_client_io_context": { - "value": "5", - "description": "Optimize the performance of a client stub. Default value 5. The higher the throughput, the higher the value, but should be in range [1, 32]." - }, - "zmq_chunk_sz": { - "value": "1048576", - "description": "Parallel payload split chunk size. Default to 1048756 bytes." - }, - "curve_key_dir": { - "value": "", - "description": "The directory to find ZMQ curve key files. This path must be specified when zmq authentication is enabled." - }, - "encrypt_kit": { - "value": "plaintext", - "description": "choose the type of encrypt. Support plaintext, default is plaintext." - }, - "enable_etcd_auth": { - "value": "false", - "description": "Whether to enable ETCD auth, default is false. ETCD certificate will be obtained." - }, - "etcd_target_name_override": { - "value": "", - "description": "Set etcd target name override for SSL host name checking, default is none. The configuration value should be consistent with the DNS content of the Subject Alternate Names of the TLS certificate." - }, - "etcd_ca": { - "value": "", - "description": "The path of encrypted root etcd certificate, default is none." - }, - "etcd_cert": { - "value": "", - "description": "The path of encrypted client's etcd certificate chain, default is none." - }, - "etcd_key": { - "value": "", - "description": "The path of encrypted client's etcd private key, default is none." - }, - "etcd_passphrase_path": { - "value": "", - "description": "The path of passphrase for the encrypted etcd encypted private key, default is none." - }, - "max_rpc_session_num": { - "value": "2048", - "description": "Maximum number of sessions that can be cached, must be within [512, 10'000]" - }, - "enable_huge_tlb": { - "value": "false", - "description": "This is controlled by the flag of mmap(MAP_HUGETLB) which can improve memory access and reducing the overhead of page table, default is disable." - }, - "enable_fallocate": { - "value": "true", - "description": "Due to k8s's resource calculation policies,shared memory is sometimes multiple counted , which can lead to client crashes, Using fallocate to address this issue." - }, - "enable_lossless_data_exit_mode": { - "value": "false", - "description": "Migrate data to another node before the node exits if other nodes are available. If this is the only node in the cluster, exits directly and the data will be lost." - }, - "enable_p2p_transfer": { - "value": "false", - "description": "Heterogeneous object transfer protocol Enables p2ptransfer." - } -} \ No newline at end of file diff --git a/cli/down.py b/cli/down.py deleted file mode 100644 index ceac9295fe9ef3f01facbeb054726b8e98782adc..0000000000000000000000000000000000000000 --- a/cli/down.py +++ /dev/null @@ -1,100 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI up command.""" -import os - -import datasystem.cli.common.util as util -from datasystem.cli.command import BaseCommand -from datasystem.cli.common.constant import ClusterConfig -from datasystem.cli.common.parallel import ParallelMixin - - -class Command(BaseCommand, ParallelMixin): - """ - Stop yuanrong datasystem worker on cluster nodes. - """ - - name = "down" - description = "stop yuanrong datasystem worker on cluster nodes" - - _config = {} - - def add_arguments(self, parser): - """ - Add arguments to parser. - - Args: - parser (ArgumentParser): Specify parser to which arguments are added. - """ - parser.add_argument( - "-f", - "--cluster_config_path", - metavar="FILE", - required=True, - help=( - "path of cluster configuration file (JSON format), " - "which can be obtained through the generate_config command" - ), - ) - - def run(self, args): - """ - Execute for down command. - - Args: - args (Namespace): Parsed arguments to hold customized parameters. - - Returns: - int: Exit code, 0 for success, 1 for failure. - """ - try: - self._config = util.load_cluster_config( - args.cluster_config_path, - [ - ClusterConfig.WORKER_NODES, - ClusterConfig.WORKER_PORT, - ClusterConfig.SSH_USER_NAME, - ClusterConfig.SSH_PRIVATE_KEY, - ], - ) - ssh_key_path = os.path.abspath( - os.path.expanduser(self._config[ClusterConfig.SSH_PRIVATE_KEY]) - ) - self._config[ClusterConfig.SSH_PRIVATE_KEY] = util.valid_safe_path(ssh_key_path) - - self.execute_parallel(self._config[ClusterConfig.WORKER_NODES]) - except Exception as e: - self.logger.error(f"Down cluster failed: {e}") - return self.FAILURE - return self.SUCCESS - - def process_node(self, node): - """ - Process stopping of worker on a single node. - - Args: - node (str): The node to stop the worker on. - """ - user_name = self._config[ClusterConfig.SSH_USER_NAME] - private_key = self._config[ClusterConfig.SSH_PRIVATE_KEY] - worker_port = self._config[ClusterConfig.WORKER_PORT] - util.is_valid_ipv4(node) - util.is_valid_port(worker_port) - util.ssh_execute( - node, - user_name, - private_key, - f"bash -l -c 'dscli stop -w {node}:{worker_port}' 2>/dev/null", - ) - self.logger.info(f"Stop worker service @ {node}:{worker_port} success.") diff --git a/cli/generate_config.py b/cli/generate_config.py deleted file mode 100644 index e0e73684b410b3fc24e48d72a7328893de192ec2..0000000000000000000000000000000000000000 --- a/cli/generate_config.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI generate_config command.""" - -import os -import shutil - -from datasystem.cli.command import BaseCommand -import datasystem.cli.common.util as util - - -class Command(BaseCommand): - """ - Generate yuanrong datasystem configuration files. - """ - - name = "generate_config" - description = "generate yuanrong datasystem cluster and worker configuration files" - - @staticmethod - def add_arguments(parser): - """ - Add arguments to parser. - - Args: - parser (ArgumentParser): Specify parser to which arguments are added. - """ - parser.add_argument( - "-o", "--output_path", - default=os.getcwd(), - help="path to save the generated configuration files, default path is the current directory" - ) - - def run(self, args): - """ - Execute for generate_config command. - - Args: - args (Namespace): Parsed arguments containing the output path. - - Raises: - FileNotFoundError: If the source configuration file does not exist. - NotADirectoryError: If the output path is not a directory. - """ - try: - output_dir = os.path.normpath(os.path.realpath(args.output_path)) - output_dir = util.valid_safe_path(output_dir) - if not os.path.isdir(output_dir): - raise NotADirectoryError(f"Path is not a directory: {output_dir}") - os.makedirs(output_dir, exist_ok=True) - - cluster_file = "cluster_config.json" - src_cluster = os.path.join(self._base_dir, cluster_file) - if not os.path.exists(src_cluster): - raise FileNotFoundError(f"Source cluster configuration file {src_cluster} does not exist") - dest_cluster = os.path.join(output_dir, cluster_file) - shutil.copyfile(src_cluster, dest_cluster) - self.logger.info(f"Cluster configuration file has been generated to {dest_cluster}") - - worker_file = "worker_config.json" - src_worker = os.path.join(self._base_dir, worker_file) - if not os.path.exists(src_worker): - raise FileNotFoundError(f"Source worker configuration file {src_worker} does not exist") - dest_worker = os.path.join(output_dir, worker_file) - shutil.copyfile(src_worker, dest_worker) - self.logger.info(f"Worker configuration file has been generated to {dest_worker}") - - self.logger.info("Configuration generation completed successfully") - except Exception as e: - self.logger.error(f"Generate failed: {e}") - return self.FAILURE - return self.SUCCESS - \ No newline at end of file diff --git a/cli/generate_cpp_template.py b/cli/generate_cpp_template.py deleted file mode 100644 index 5607279e7b84085d79a8c276d62f45600501793b..0000000000000000000000000000000000000000 --- a/cli/generate_cpp_template.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI command to generate C++ code template.""" - -import os -import shutil -from pathlib import Path -import datasystem.cli.common.util as util -from datasystem.cli.command import BaseCommand - - -class Command(BaseCommand): - """ - Generate C++ code template for yuanrong datasystem. - """ - - name = 'generate_cpp_template' - description = 'generate C++ code template for yuanrong datasystem' - - @staticmethod - def add_arguments(parser): - """ - Add arguments to parser. - - Args: - parser (ArgumentParser): Specify parser to which arguments are added. - """ - parser.add_argument( - '-o', '--output_path', - type=str, - metavar='OUTPUT_PATH', - default=os.getcwd(), - help='path to save the generated C++ code template, default path is the current directory. \ - Example: dscli generate_cpp_template --output_path /home/user/cppTemplates' - ) - - def run(self, args): - """ - Execute for generate_cpp_template command. - - Args: - args (Namespace): Parsed command-line arguments. - """ - - # Process output path - output_path = Path(args.output_path) / 'cpp_template' - output_path = output_path.resolve() - util.valid_safe_path(output_path) - - # Create output directory - output_path.mkdir(parents=True, exist_ok=True) - - # Get C++ code template path - cpp_template_path = os.path.join(self._base_dir, 'cpp_template') - - # Copy template to output directory - try: - shutil.copytree(cpp_template_path, output_path, dirs_exist_ok=True) - except shutil.Error as e: - self.logger.error(f"Error copying files: {e}") - return self.FAILURE - except OSError as e: - self.logger.error(f"OS error occurred: {e}") - return self.FAILURE - - # Get lib path - src_lib_path = os.path.join(self._base_dir, 'lib') - dest_lib_path = os.path.join(output_path, 'lib') - try: - shutil.copytree(src_lib_path, dest_lib_path, dirs_exist_ok=True) - except shutil.Error as e: - self.logger.error(f"Error copying files: {e}") - return self.FAILURE - except OSError as e: - self.logger.error(f"OS error occurred: {e}") - return self.FAILURE - - # Get include path - src_include_path = os.path.join(self._base_dir, 'include') - dest_include_path = os.path.join(output_path, 'include') - try: - shutil.copytree(src_include_path, dest_include_path, dirs_exist_ok=True) - except shutil.Error as e: - self.logger.error(f"Error copying files: {e}") - return self.FAILURE - except OSError as e: - self.logger.error(f"OS error occurred: {e}") - return self.FAILURE - - # Provide feedback for successful generation - self.logger.info(f"\nC++ code template generated successfully at: {output_path}") - self.logger.info("You can now use this template for your C++ development.") - return self.SUCCESS diff --git a/cli/generate_helm_chart.py b/cli/generate_helm_chart.py deleted file mode 100644 index d5636333a1499e89490227bcd61524d013aa0a58..0000000000000000000000000000000000000000 --- a/cli/generate_helm_chart.py +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI command to generate Helm chart.""" - -import os -import shutil -from pathlib import Path -import datasystem.cli.common.util as util -from datasystem.cli.command import BaseCommand - - -class Command(BaseCommand): - """ - Generate Helm chart for yuanrong datasystem deployment. - """ - - - name = 'generate_helm_chart' - description = 'generate Helm chart for yuanrong datasystem deployment' - - @staticmethod - def add_arguments(parser): - """ - Add arguments to parser. - - Args: - parser (ArgumentParser): Specify parser to which arguments are added. - """ - parser.add_argument( - '-o', '--output_path', - type=str, - metavar='OUTPUT_PATH', - default=os.getcwd(), - help='path to save the generated Helm chart, default path is the current directory. \ - Example: dscli generate_helm_chart --output-path /home/user/helmCharts' - ) - - def run(self, args): - """ - Execute for generate_helm_chart command. - - Args: - args (Namespace): Parsed command-line arguments. - """ - - # Process output path - output_path = Path(args.output_path) / 'datasystem-helm-chart' - output_path = output_path.resolve() - util.valid_safe_path(output_path) - - # Create output directory - output_path.mkdir(parents=True, exist_ok=True) - - # Get Helm chart template path - helm_chart_template_path = os.path.join(self._base_dir, 'helm_chart') - - # Copy template to output directory - try: - shutil.copytree(helm_chart_template_path, output_path, dirs_exist_ok=True) - except shutil.Error as e: - self.logger.error(f"Error copying files: {e}") - return self.FAILURE - except OSError as e: - self.logger.error(f"OS error occurred: {e}") - return self.FAILURE - - # Provide feedback for successful generation - self.logger.info(f"\nHelm chart generated successfully at: {output_path}") - self.logger.info("You can now use this chart for deployment with Helm.") - return self.SUCCESS diff --git a/cli/runscript.py b/cli/runscript.py deleted file mode 100644 index 2d3c8e882adffb2fa2d7d6cc17608652ea365756..0000000000000000000000000000000000000000 --- a/cli/runscript.py +++ /dev/null @@ -1,118 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI runscript command.""" - -import os -import shlex - -import datasystem.cli.common.util as util -from datasystem.cli.command import BaseCommand -from datasystem.cli.common.constant import ClusterConfig -from datasystem.cli.common.parallel import ParallelMixin - - -class Command(BaseCommand, ParallelMixin): - """ - Run script on cluster nodes. - """ - - name = "runscript" - description = "run script on cluster nodes" - - _config = {} - _script_path = "" - - def add_arguments(self, parser): - """ - Add arguments to parser. - - Args: - parser (ArgumentParser): Specify parser to which arguments are added. - """ - parser.add_argument( - "-f", - "--cluster_config_path", - metavar="FILE", - required=True, - help="path of cluster configuration file (JSON format)", - ) - parser.add_argument("script", help="script to execute, e.g., install.sh") - - def run(self, args): - """ - Execute for runscript command. - - Args: - args (Namespace): Parsed arguments to hold customized parameters. - - Returns: - int: Exit code, 0 for success, 1 for failure. - """ - try: - self._config = util.load_cluster_config( - args.cluster_config_path, - [ - ClusterConfig.WORKER_NODES, - ClusterConfig.SSH_USER_NAME, - ClusterConfig.SSH_PRIVATE_KEY, - ], - ) - ssh_key_path = os.path.realpath( - os.path.expanduser(self._config[ClusterConfig.SSH_PRIVATE_KEY]) - ) - self._config[ClusterConfig.SSH_PRIVATE_KEY] = util.valid_safe_path(ssh_key_path) - - self._script_path = os.path.realpath(os.path.expanduser(args.script)) - if not os.path.exists(self._script_path): - raise FileNotFoundError( - f"Script file {self._script_path} does not exist." - ) - - self.execute_parallel(self._config[ClusterConfig.WORKER_NODES]) - except Exception as e: - self.logger.error(f"Run script failed: {e}") - return self.FAILURE - return self.SUCCESS - - def process_node(self, worker_node): - """ - Execute a script on a single worker node. - - Args: - worker_node (str): The IP address of the worker node. - """ - remote_script_path = os.path.normpath(f"~/{os.path.basename(self._script_path)}") - remote_script_path = util.valid_safe_path(remote_script_path) - - try: - user_name = self._config[ClusterConfig.SSH_USER_NAME] - private_key = self._config[ClusterConfig.SSH_PRIVATE_KEY] - util.scp_upload( - self._script_path, - worker_node, - remote_script_path, - user_name, - private_key, - ) - remote_script_path = util.validate_no_injection(remote_script_path) - util.ssh_execute( - worker_node, user_name, private_key, f"bash {shlex.quote(remote_script_path)}" - ) - self.logger.info(f"Script executed successfully on {worker_node}.") - - util.ssh_execute( - worker_node, user_name, private_key, f"rm -f {shlex.quote(remote_script_path)}" - ) - except Exception as e: - raise RuntimeError(f"Error executing script on {worker_node}: {e}") from e diff --git a/cli/start.py b/cli/start.py deleted file mode 100644 index c1020439eec097c6f2075d742f8f750918731282..0000000000000000000000000000000000000000 --- a/cli/start.py +++ /dev/null @@ -1,279 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI start command.""" - -import argparse -import json -import os -import subprocess -import time -from typing import Dict - -import datasystem.cli.common.util as util -from datasystem.cli.command import BaseCommand - - -class Command(BaseCommand): - """ - Start yuanrong datasystem worker service. - """ - - name = "start" - description = "startup yuanrong datasystem worker service" - - _required_params = ["etcd_address"] - _DEFAULT_WORKER_ADDRESS = "127.0.0.1:31501" - _wait_worker_ready_time = 90 - _home_dir = "" - - def add_arguments(self, parser): - """ - Add arguments to parser. - - Args: - parser (ArgumentParser): Specify parser to which arguments are added. - """ - group = parser.add_mutually_exclusive_group(required=True) - group.add_argument( - "-f", - "--worker_config_path", - metavar="FILE", - help=( - "start worker by using configuration file (JSON format), " - "which can be obtained through the generate_config command" - ), - ) - - group.add_argument( - "-w", - "--worker_args", - nargs=argparse.REMAINDER, - help=( - "start worker by using command line arguments, " - "e.g, --worker_address '127.0.0.1:31501' --etcd_address '127.0.0.1:2379'" - ), - ) - - parser.add_argument( - "-d", - "--datasystem_home_dir", - metavar="DIR", - help=( - "replace leading '.' in default configuration paths with this directory, " - "e.g. if the configuration is './yr_datasystem/log_dir', " - "the '.' will be replaced with the datasystem_home_dir." - ), - ) - - def run(self, args): - """ - Execute for start command. - - Args: - args (Namespace): Parsed arguments to hold customized parameters. - - Raises: - Exception: If any error occurs during worker startup, an exception is raised with error details. - """ - final_params = {} - - try: - if args.datasystem_home_dir: - home_dir = os.path.abspath(os.path.expanduser(args.datasystem_home_dir)) - self._home_dir = util.valid_safe_path(home_dir) - if args.worker_config_path: - final_params = self.load_config(args.worker_config_path) - elif args.worker_args: - final_params = self.parse_cli_args(args.worker_args) - final_params.setdefault("worker_address", self._DEFAULT_WORKER_ADDRESS) - self.start_worker(final_params) - except Exception as e: - self.logger.error(f"Start failed: {e}") - return self.FAILURE - return self.SUCCESS - - def load_config(self, config_path: str) -> Dict[str, str]: - """ - Load the configuration file and extract necessary parameters. - - Args: - config_path (str): Path to the configuration file. - - Returns: - Dict[str, str]: Dictionary containing extracted parameters. - - Raises: - ValueError: If the configuration file format is incorrect. - """ - config_path = os.path.realpath(os.path.expanduser(config_path)) - config_path = util.valid_safe_path(config_path) - - default_config_path = os.path.join(self._base_dir, "worker_config.json") - default_config_path = util.valid_safe_path(default_config_path) - try: - with open(config_path, "r") as f: - config = json.load(f) - with open(default_config_path, "r") as f: - default_config = json.load(f) - except json.JSONDecodeError as e: - raise ValueError("The configuration file format is incorrect.") from e - - modified = util.compare_and_process_config(self._home_dir, config, default_config) - for key, _ in modified.items(): - self.logger.info(f"Modifed config - {key}") - params = {} - for flag, conf in config.items(): - if not str(flag).strip(): - continue - params[flag] = str(conf.get("value", "")).strip() - if flag == "log_dir": - self.logger.info(f"Log directory configured at: {params[flag]}") - return params - - def parse_cli_args(self, cli_args: list) -> Dict[str, str]: - """ - Parse command line arguments into a dictionary. - - Args: - cli_args (list): List of command line arguments. - - Returns: - Dict[str, str]: Dictionary containing parsed parameters. - - Raises: - ValueError: If there is a mismatch between parameter names and values. - """ - params = {} - current_flag = None - - for arg in cli_args: - if arg.startswith("--"): - if current_flag: - raise ValueError(f"Param {current_flag} is missing a value") - current_flag = arg[2:] - else: - if not current_flag: - raise ValueError(f"No parameter name specified: {arg}") - params[current_flag] = arg - current_flag = None - - if current_flag: - raise ValueError(f"Param {current_flag} is missing a value") - - self.fill_params(params) - return params - - def fill_params(self, params: Dict[str, str]): - """Fill the parameters with default values from the configuration file. - - Args: - params: Dictionary to be filled with default parameters. - - Raises: - ValueError: If the configuration file format is incorrect. - """ - default_config_path = os.path.join(self._base_dir, "worker_config.json") - try: - with open(default_config_path, "r") as f: - default_config = json.load(f) - except json.JSONDecodeError as e: - raise ValueError("The configuration file format is incorrect.") from e - for key, item in default_config.items(): - if key in params: - continue - params[key] = str(item.get("value", "")) - if not params[key].startswith("./"): - continue - if self._home_dir: - params[key] = os.path.join(self._home_dir, params[key][2:]) - else: - params[key] = os.path.realpath(util.get_timestamped_path(params[key])) - self.logger.info(f"Log directory configured at: {params['log_dir']}") - - def start_worker(self, params: Dict[str, str]): - """ - Start the datasystem worker service with specified parameters. - - Args: - params (Dict[str, str]): Dictionary containing worker configuration parameters. - - Raises: - ValueError: If required parameters are missing. - RuntimeError: If the worker service fails to start or exits abnormally. - """ - for param in self._required_params: - if not params.get(param): - raise ValueError(f"Missing required parameters: {param}") - - cmd = self.build_command(params) - lib_dir = os.path.join(self._base_dir, "lib") - env = os.environ.copy() - env["LD_LIBRARY_PATH"] = f"{lib_dir}:{env.get('LD_LIBRARY_PATH', '')}" - try: - ready_check_path = params.get("ready_check_path") - if not ready_check_path: - raise RuntimeError("ready_check_path is empty") - ready_check_path = os.path.abspath(ready_check_path) - if os.path.exists(ready_check_path) and os.path.isfile(ready_check_path): - os.remove(ready_check_path) - process = subprocess.Popen( - cmd, - env=env, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - text=True, - start_new_session=True, - ) - for _ in range(self._wait_worker_ready_time): - return_code = process.poll() - if return_code is not None: - stdout, stderr = process.communicate(timeout=10) - self.logger.error(f"[ FAILED ] Worker exited with code {return_code}\n output: {stdout + stderr}") - raise RuntimeError(f"Worker service exited abnormally with code {return_code}") - if os.path.exists(ready_check_path): - self.logger.info( - "[ OK ] Start worker service @ {} success, PID: {}".format( - params["worker_address"], process.pid - ) - ) - break - time.sleep(1) - else: - self.logger.error( - f"[ FAILED ] Worker service is not ready within {self._wait_worker_ready_time} seconds" - ) - raise RuntimeError(f"Worker service startup timeout") - - except Exception as e: - self.logger.error("[ FAILED ] Start worker service @ {} failed: {}".format(params["worker_address"], e)) - raise RuntimeError("The worker service exited abnormally") from e - - def build_command(self, params: Dict[str, str]) -> list: - """ - Construct the command line parameters for starting the worker. - - Args: - params (Dict[str, str]): Dictionary containing worker configuration parameters. - - Returns: - list: List of command line arguments. - """ - cmd = [util.validate_no_injection(os.path.abspath(os.path.join(self._base_dir, "datasystem_worker")))] - for k, v in params.items(): - if not str(v).strip(): - continue - k = util.validate_no_injection(k) - v = util.validate_no_injection(v) - cmd.extend([f"--{k}={v}"]) - return cmd diff --git a/cli/stop.py b/cli/stop.py deleted file mode 100644 index 092d6444f0d5ee56f2041858214d38982d0cb201..0000000000000000000000000000000000000000 --- a/cli/stop.py +++ /dev/null @@ -1,205 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI stop command.""" - -import json -import os -import signal -import subprocess -import time - -import datasystem.cli.common.util as util -from datasystem.cli.command import BaseCommand - - -class Command(BaseCommand): - """ - Stop yuanrong datasystem worker service. - """ - - name = "stop" - description = "stop yuanrong datasystem worker service" - - _timeout = 1800 - _check_interval = 0.5 - - def add_arguments(self, parser): - """ - Add arguments to parser. - - Args: - parser (ArgumentParser): Specify parser to which arguments are added. - """ - group = parser.add_mutually_exclusive_group(required=True) - group.add_argument( - "-f", "--worker_config_path", metavar="FILE", - help=( - "stop worker by using configuration file (JSON format), " - "which can be obtained through the generate_config command" - ), - ) - - group.add_argument( - "-w", "--worker_address", metavar="ADDR", - help=("stop worker by specifying the worker address(ip:port), e.g., 127.0.0.1:31501"), - ) - - def run(self, args): - """ - Execute for stop command. - - Args: - args (Namespace): Parsed arguments to hold customized parameters. - - Returns: - int: Exit code, 0 for success, 1 for failure. - """ - try: - address = self.get_worker_address(args) - pid = self.get_unique_pid(address) - self.graceful_kill(pid) - if self.wait_exit(pid): - self.logger.info(f"[ OK ] Stop worker service @ {address} normally, PID: {pid}") - return self.SUCCESS - if self.force_kill(pid): - self.logger.info(f"[ OK ] Force stop worker service @ {address}, PID: {pid}") - return self.SUCCESS - raise RuntimeError(f"[ FAILED ] Force stop worker failed @ {address}, PID: {pid}") - except Exception as e: - self.logger.error(f"Stop failed: {e}") - return self.FAILURE - - def get_worker_address(self, args): - """ - Obtain the address of the worker to be stopped. - - Args: - args (Namespace): Parsed arguments containing worker configuration or address. - - Returns: - str: The worker address. - - Raises: - ValueError: If the configuration file format is incorrect. - RuntimeError: If the worker_address is missing or invalid in the configuration. - """ - if args.worker_address: - return args.worker_address - - config_path = os.path.relpath(os.path.expanduser(args.worker_config_path)) - config_path = util.valid_safe_path(config_path) - try: - with open(config_path, 'r') as f: - config = json.load(f) - except json.JSONDecodeError as e: - raise ValueError("The configuration file format is incorrect.") from e - - worker_config = config["worker_address"] - - if not worker_config: - raise RuntimeError("The configuration file is missing worker_address") - - address = worker_config.get("value") or worker_config.get("default") - if not address: - raise RuntimeError("Invalid worker_address value") - - return address - - def get_unique_pid(self, address): - """ - Get the unique process PID of the worker service. - - Args: - address (str): The worker address to find the corresponding process. - - Returns: - int: The process ID (PID) of the worker service. - - Raises: - RuntimeError: If no matching process or multiple processes are found. - """ - util.is_valid_address_port(address) - target_arg = f"-worker_address={address}" - - cmd = ["pgrep", "-f", "--", target_arg] - try: - output = subprocess.check_output( - cmd, - stderr=subprocess.STDOUT, - timeout=5, - text=True - ) - - except subprocess.CalledProcessError as e: - raise RuntimeError(f"No matching process found for {target_arg}") from e - - pids = [int(pid) for pid in output.strip().split('\n') if pid] - if not pids: - raise RuntimeError(f"No matching process found for {target_arg}") - if len(pids) > 1: - raise RuntimeError(f"Multiple matching processes found for {target_arg}: {pids}") - - return pids[0] - - def graceful_kill(self, pid): - """ - Gracefully terminate the process. - - Args: - pid (int): The process ID (PID) to terminate. - - Raises: - RuntimeError: If the process does not exist or insufficient permissions. - """ - try: - os.kill(pid, signal.SIGTERM) - except ProcessLookupError as e: - raise RuntimeError("The process no longer exists") from e - except PermissionError as e: - raise RuntimeError("Insufficient permissions to operate the process") from e - - def force_kill(self, pid): - """ - Forcefully terminate a process. - - Args: - pid (int): The process ID (PID) to terminate. - - Returns: - bool: True if the process was successfully terminated, False otherwise. - """ - try: - os.kill(pid, signal.SIGKILL) - except ProcessLookupError: - return False - return True - - def wait_exit(self, pid): - """ - Wait for the process to exit. - - Args: - pid (int): The process ID (PID) to monitor. - - Returns: - bool: True if the process exits within the timeout, False otherwise. - """ - start_time = time.time() - while time.time() - start_time < self._timeout: - try: - os.kill(pid, 0) - except ProcessLookupError: - return True - time.sleep(self._check_interval) - return False diff --git a/cli/up.py b/cli/up.py deleted file mode 100644 index bb78fa231416e99b67c3c254bd9d190e225aa249..0000000000000000000000000000000000000000 --- a/cli/up.py +++ /dev/null @@ -1,182 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""YuanRong datasystem CLI up command.""" - -import json -import os -import shlex - -import datasystem.cli.common.util as util -from datasystem.cli.command import BaseCommand -from datasystem.cli.common.constant import ClusterConfig -from datasystem.cli.common.parallel import ParallelMixin - - -class Command(BaseCommand, ParallelMixin): - """ - Startup yuanrong datasystem worker on cluster nodes. - """ - - name = "up" - description = "startup yuanrong datasystem worker on cluster nodes" - - _config = {} - _home_dir = "" - _hidden_config_path = "" - - def add_arguments(self, parser): - """ - Add arguments to parser. - - Args: - parser (ArgumentParser): Specify parser to which arguments are added. - """ - parser.add_argument( - "-f", - "--cluster_config_path", - metavar="FILE", - required=True, - help=( - "path of cluster configuration file (JSON format), " - "which can be obtained through the generate_config command" - ), - ) - - parser.add_argument( - "-d", - "--datasystem_home_dir", - metavar="DIR", - help=( - "directory to replace the current paths in the configuration, " - "e.g. if the config contains './yr_datasystem/log_dir', " - "'.' will be replaced with the datasystem_home_dir." - ), - ) - - def run(self, args): - """ - Execute for up command. - - Args: - args (Namespace): Parsed arguments to hold customized parameters. - - Returns: - int: Exit code, 0 for success, 1 for failure. - """ - try: - self._config = util.load_cluster_config(args.cluster_config_path) - ssh_key_path = os.path.realpath( - os.path.expanduser(self._config[ClusterConfig.SSH_PRIVATE_KEY]) - ) - self._config[ClusterConfig.SSH_PRIVATE_KEY] = util.valid_safe_path(ssh_key_path) - if args.datasystem_home_dir: - home_dir = os.path.realpath( - os.path.expanduser(args.datasystem_home_dir) - ) - self._home_dir = util.valid_safe_path(home_dir) - - self.update_worker_config() - self.execute_parallel(self._config[ClusterConfig.WORKER_NODES]) - except Exception as e: - self.logger.error(f"Up cluster failed: {e}") - return self.FAILURE - return self.SUCCESS - - def process_node(self, node): - """ - Process startup of worker on a single node. - - Args: - node (str): The node to start the worker on. - """ - user_name = self._config[ClusterConfig.SSH_USER_NAME] - private_key = self._config[ClusterConfig.SSH_PRIVATE_KEY] - worker_port = self._config[ClusterConfig.WORKER_PORT] - self._hidden_config_path = util.validate_no_injection(self._hidden_config_path) - util.ssh_execute( - node, - user_name, - private_key, - f"mkdir -p -- {shlex.quote(os.path.dirname(self._hidden_config_path))}", - ) - - # Upload the modified worker config to remote - util.scp_upload( - self._hidden_config_path, - node, - self._hidden_config_path, - user_name, - private_key, - ) - - # Update worker_address - util.is_valid_ipv4(node) - util.is_valid_port(worker_port) - sed_command = ( - r"sed -i " - r'"/\"worker_address\"/,/}/ s/\"value\"\s*:\s*\"[^\"]*\"/\"value\": \"%s\"/g" ' - r"%s" - ) % (f"{node}:{worker_port}", self._hidden_config_path) - util.ssh_execute( - node, - user_name, - private_key, - sed_command, - ) - - # Startup worker - util.ssh_execute( - node, - user_name, - private_key, - f"bash -l -c 'dscli start -f {shlex.quote(self._hidden_config_path)}'", - ) - self.logger.info(f"Start worker service @ {node}:{worker_port} success.") - - def update_worker_config(self): - """ - Update the worker configuration. - - Raises: - ValueError: If the configuration file format is incorrect. - """ - config_path = os.path.realpath( - os.path.expanduser(self._config[ClusterConfig.WORKER_CONFIG_PATH]) - ) - config_path = util.valid_safe_path(config_path) - default_config_path = os.path.join(self._base_dir, "worker_config.json") - try: - with open(config_path, "r") as f: - config = json.load(f) - with open(default_config_path, "r") as f: - default_config = json.load(f) - except json.JSONDecodeError as e: - raise ValueError( - f"The configuration file {config_path} format is incorrect." - ) from e - - modified = util.compare_and_process_config(self._home_dir, config, default_config) - for key, _ in modified.items(): - self.logger.info(f"Modifed config - {key}") - log_dir = config.get("log_dir", {}).get("value", "") - self.logger.info(f"Log directory configured at: {log_dir}") - - dir_name = os.path.dirname(config_path) - base_name = os.path.basename(config_path) - self._hidden_config_path = os.path.join(dir_name, f".{base_name}") - try: - with open(self._hidden_config_path, "w") as f: - json.dump(config, f, indent=4) - except IOError as e: - raise ValueError(f"Failed to write to {self._hidden_config_path}.") from e diff --git a/cmake/config.cmake.in b/cmake/config.cmake.in deleted file mode 100644 index 189a5ed738cc91a0f547f0e08fdee09f906e4573..0000000000000000000000000000000000000000 --- a/cmake/config.cmake.in +++ /dev/null @@ -1,18 +0,0 @@ -# This config sets the following targets in your project: -# -# @PROJECT_NAME@_FOUND - true if @PROJECT_NAME@ found on the system -# @PROJECT_NAME@_INCLUDE_DIR - the directory containing @PROJECT_NAME@ headers -# datasystem - the @PROJECT_NAME@ object cache shared library to link - -@PACKAGE_INIT@ - -# Load targets only once. If we load targets multiple times, CMake reports already existent target error. -if (NOT TARGET datasystem) - include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") - - # installation prefix - get_filename_component (CMAKE_CURRENT_LIST_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) - get_filename_component (_INSTALL_PREFIX "${CMAKE_CURRENT_LIST_DIR}/../../.." ABSOLUTE) - - set(@PROJECT_NAME@_INCLUDE_DIR "${_INSTALL_PREFIX}/include") -endif() \ No newline at end of file diff --git a/cmake/dependency.cmake b/cmake/dependency.cmake deleted file mode 100644 index 4970b88f4cd3e3f8e3bcfa2376121e57ba67c3f3..0000000000000000000000000000000000000000 --- a/cmake/dependency.cmake +++ /dev/null @@ -1,41 +0,0 @@ -if(POLICY CMP0144) - cmake_policy(SET CMP0144 NEW) -endif() -include(FindThreads) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/absl.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/re2.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/zlib.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/libzmq.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/jemalloc.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/rocksdb.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/securec.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/tbb.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/nlohmann_json.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/openssl.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/libcurl.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/protobuf.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/grpc.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/etcdapi.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/iconv.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/xml2.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/pcre.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/cjson.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/spdlog.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/external_libs/sdk_c_obs.cmake) -if (BUILD_WITH_URMA) - include(${CMAKE_SOURCE_DIR}/cmake/external_libs/ub.cmake) - include(${CMAKE_SOURCE_DIR}/cmake/external_libs/urma.cmake) -endif() - -if (WITH_TESTS) - include(${CMAKE_SOURCE_DIR}/cmake/external_libs/gtest.cmake) -endif() - -if (BUILD_PYTHON_API) - include(${CMAKE_SOURCE_DIR}/cmake/external_libs/pybind11.cmake) -endif() - -if (BUILD_HETERO) - include(${CMAKE_SOURCE_DIR}/cmake/external_libs/ascend.cmake) - include(${CMAKE_SOURCE_DIR}/cmake/external_libs/p2phccl.cmake) -endif() diff --git a/cmake/external_libs/absl.cmake b/cmake/external_libs/absl.cmake deleted file mode 100644 index 0fa982916b068328f574c81f9cb45c2a2f485194..0000000000000000000000000000000000000000 --- a/cmake/external_libs/absl.cmake +++ /dev/null @@ -1,44 +0,0 @@ -set(absl_COMMIT_ID "20240722") -set(absl_VERSION 20240722) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(absl_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/lts_2024_07_22.zip") -else() - set(absl_URL "https://gitee.com/mirrors/abseil-cpp/repository/archive/lts_2024_07_22.zip") -endif() -set(absl_SHA256 "c1e391c517790669dfcbbfda1278a61053679c303c0fb05018bf2266197f054e") - -set(absl_CMAKE_OPTIONS - -DCMAKE_BUILD_TYPE:STRING=Release - -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=TRUE - -DCMAKE_CXX_STANDARD=17) - -set(absl_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -set(absl_PATCHES ${CMAKE_SOURCE_DIR}/third_party/patches/absl/absl_failure_signal_handler.patch) - -add_thirdparty_lib(absl - URL ${absl_URL} - SHA256 ${absl_SHA256} - FAKE_SHA256 ${absl_FAKE_SHA256} - VERSION ${absl_VERSION} - CONF_OPTIONS ${absl_CMAKE_OPTIONS} - CXX_FLAGS ${absl_CXX_FLAGS} - PATCHES ${absl_PATCHES} - ) - -set(absl_DIR ${absl_ROOT}) -find_package(absl REQUIRED) -get_property(absl_INCLUDE_DIR TARGET absl::base PROPERTY INTERFACE_INCLUDE_DIRECTORIES) -include_directories(${absl_INCLUDE_DIR}) - -if (EXISTS ${absl_ROOT}/lib64) - set(absl_PKG_PATH ${absl_ROOT}/lib64/cmake/absl) -else() - set(absl_PKG_PATH ${absl_ROOT}/lib/cmake/absl) -endif() - -if (DEFINED EXPORT_TO_USER_ENV_FILE) - file(APPEND "${EXPORT_TO_USER_ENV_FILE}" - "set(absl_PKG_PATH ${absl_PKG_PATH})" "\n" - ) -endif() diff --git a/cmake/external_libs/ascend.cmake b/cmake/external_libs/ascend.cmake deleted file mode 100644 index 51a2147233efa00a141a2e6bca597b0c18939676..0000000000000000000000000000000000000000 --- a/cmake/external_libs/ascend.cmake +++ /dev/null @@ -1,17 +0,0 @@ -# The environment variable ASCEND_CUSTOM_PATH is used to locate the Ascend install path. -# So cmake can find the header files and libraries in the compile stage. -# If user don't set ASCEND_CUSTOM_PATH, find Ascend in `/usr/local/Ascend/ascend-toolkit/latest` in default. -if (DEFINED ENV{ASCEND_HOME_PATH}) - set(Ascend_ROOT $ENV{ASCEND_HOME_PATH}) -elseif(DEFINED ENV{ASCEND_CUSTOM_PATH}) - set(Ascend_ROOT $ENV{ASCEND_CUSTOM_PATH}/latest) -else() - set(Ascend_ROOT /usr/local/Ascend/ascend-toolkit/latest) -endif() - -find_package(Ascend REQUIRED) - -include_directories(SYSTEM ${ASCEND_INCLUDE_DIR}) -include_directories(SYSTEM ${ASCEND_INCLUDE_DIR}/experiment/runtime) -include_directories(SYSTEM ${ASCEND_INCLUDE_DIR}/experiment/msprof) -add_definitions(-DUSE_ASCEND) diff --git a/cmake/external_libs/cjson.cmake b/cmake/external_libs/cjson.cmake deleted file mode 100644 index d5c9d9a2477dfd11ddee999001589b3b7b138b92..0000000000000000000000000000000000000000 --- a/cmake/external_libs/cjson.cmake +++ /dev/null @@ -1,31 +0,0 @@ -set(cjson_VERSION 1.7.17) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(cjson_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/v1.7.17.zip") -else() - set(cjson_URL "https://gitee.com/mirrors/cJSON/repository/archive/v1.7.17.zip") -endif() -set(cjson_SHA256 "6edd31f4faa373dc94b26e4ab6b4483d32fbfc003771a6d0e1a9106e0d9521f2") - -set(cjson_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(cjson_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(cjson_LINK_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -if ("$ENV{DS_PACKAGE}" STREQUAL "") - set(cjson_PATCHES ${CMAKE_SOURCE_DIR}/third_party/patches/cjson/1.7.17/Backport-CVE-2024-31755-Add-NULL-check-to-cJSON_SetValuestring-c.patch) -endif() - -add_thirdparty_lib(CJSON - URL ${cjson_URL} - SHA256 ${cjson_SHA256} - FAKE_SHA256 ${cjson_FAKE_SHA256} - VERSION ${cjson_VERSION} - C_FLAGS ${cjson_C_FLAGS} - CXX_FLAGS ${cjson_CXX_FLAGS} - LINK_FLAGS ${cjson_LINK_FLAGS} - PATCHES ${cjson_PATCHES}) - -find_library(CJSON - NAMES cjson - PATHS ${CJSON_ROOT} - PATH_SUFFIXES lib lib64 - REQUIRED - NO_DEFAULT_PATH) \ No newline at end of file diff --git a/cmake/external_libs/etcdapi.cmake b/cmake/external_libs/etcdapi.cmake deleted file mode 100644 index aa4f070c336cb167635bb12950602b991e24b436..0000000000000000000000000000000000000000 --- a/cmake/external_libs/etcdapi.cmake +++ /dev/null @@ -1,23 +0,0 @@ -set(PROTOBUF_DIR "${CMAKE_SOURCE_DIR}/third_party/protos") - -# Generate cpp files. -file(GLOB_RECURSE PROTO_SRCS "${PROTOBUF_DIR}/*.proto") - -generate_proto_cpp(ETCD_PROTO_SRCS ETCD_PROTO_HDRS ${CMAKE_CURRENT_BINARY_DIR}/third_party/protos - PROTO_FILES ${PROTO_SRCS} - SOURCE_ROOT ${PROTOBUF_DIR}) - -set(GRPC_PROTO_SRCS - "${PROTOBUF_DIR}/etcd/api/etcdserverpb/rpc.proto" - "${PROTOBUF_DIR}/etcd/v3election.proto" - "${PROTOBUF_DIR}/etcd/v3lock.proto") - -generate_grpc_cpp(ETCD_GRPC_PROTO_SRCS ETCD_GRPC_PROTO_HDRS ${CMAKE_CURRENT_BINARY_DIR}/third_party/protos - PROTO_FILES ${GRPC_PROTO_SRCS} - SOURCE_ROOT ${PROTOBUF_DIR}) - -include_directories(${CMAKE_CURRENT_BINARY_DIR}/third_party/protos) - -add_library(etcdapi_proto STATIC ${ETCD_PROTO_SRCS} ${ETCD_GRPC_PROTO_SRCS}) -target_link_libraries(etcdapi_proto ${PROTOBUF_LIBRARIES} gRPC::grpc++) -target_include_directories(etcdapi_proto PUBLIC ${Protobuf_INCLUDE_DIRS}) diff --git a/cmake/external_libs/grpc.cmake b/cmake/external_libs/grpc.cmake deleted file mode 100644 index 7e6cc84ad89252a597261d4f440d8aa0e50fc89c..0000000000000000000000000000000000000000 --- a/cmake/external_libs/grpc.cmake +++ /dev/null @@ -1,207 +0,0 @@ -# Build the libs grpc depends -# c-ares -set(c-ares_VERSION 1.19.1) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(c-ares_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/cares-1_19_1.zip") -else() - set(c-ares_URL "https://gitee.com/mirrors/c-ares/repository/archive/cares-1_19_1.zip") -endif() -set(c-ares_SHA256 "edcaac184aff0e6b6eb7b9ede7a55f36c7fc04085d67fecff2434779155dd8ce") - -set(c-ares_CMAKE_OPTIONS - -DCMAKE_BUILD_TYPE:STRING=Release - -DCARES_SHARED:BOOL=OFF - -DCARES_STATIC:BOOL=ON - -DCARES_STATIC_PIC:BOOL=ON - -DHAVE_LIBNSL:BOOL=OFF) - -set(c-ares_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -add_thirdparty_lib(c-ares - URL ${c-ares_URL} - SHA256 ${c-ares_SHA256} - FAKE_SHA256 ${c-ares_FAKE_SHA256} - VERSION ${c-ares_VERSION} - CONF_OPTIONS ${c-ares_CMAKE_OPTIONS} - CXX_FLAGS ${c-ares_CXX_FLAGS}) - -if (EXISTS ${c-ares_ROOT}/lib64) - set(c-ares_PKG_PATH ${c-ares_ROOT}/lib64/cmake/c-ares) -else() - set(c-ares_PKG_PATH ${c-ares_ROOT}/lib/cmake/c-ares) -endif() - -# grpc -set(gRPC_VERSION 1.65.4) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(gRPC_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/v1.65.4.tar.gz") -else() - set(gRPC_URL "https://gitee.com/mirrors/grpc/repository/archive/v1.65.4.tar.gz") -endif() -set(gRPC_SHA256 "dd60131b74bd1ecb3ffd29a31a6d68d6bb009106bd22c4be140e40f5d2baf2f6") - -if (EXISTS ${Protobuf_ROOT}/lib64) - set(Protobuf_PKG_PATH ${Protobuf_ROOT}/lib64/cmake/protobuf) - set(utf8_range_PKG_PATH ${Protobuf_ROOT}/lib64/cmake/utf8_range) -else() - set(Protobuf_PKG_PATH ${Protobuf_ROOT}/lib/cmake/protobuf) - set(utf8_range_PKG_PATH ${Protobuf_ROOT}/lib/cmake/utf8_range) -endif() - -set(_ORG_LD_PATH $ENV{LD_LIBRARY_PATH}) -set(ENV{LD_LIBRARY_PATH} "${Protobuf_LIB_PATH}:${_ORG_LD_PATH}") - -set(gRPC_CMAKE_OPTIONS - -DCMAKE_BUILD_TYPE:STRING=Release - -DBUILD_SHARED_LIBS:BOOL=ON - -DgRPC_INSTALL:BOOL=ON - -DgRPC_DOWNLOAD_ARCHIVES:BOOL=OFF - -DgRPC_BUILD_TESTS:BOOL=OFF - -DgRPC_PROTOBUF_PROVIDER:STRING=package - -DgRPC_PROTOBUF_PACKAGE_TYPE:STRING=CONFIG - -Dutf8_range_DIR:PATH=${utf8_range_PKG_PATH} - -DProtobuf_DIR:PATH=${Protobuf_PKG_PATH} - -DgRPC_ABSL_PROVIDER:STRING=package - -Dabsl_DIR:PATH=${absl_PKG_PATH} - -DgRPC_CARES_PROVIDER:STRING=package - -Dc-ares_DIR:PATH=${c-ares_PKG_PATH} - -DgRPC_RE2_PROVIDER:STRING=package - -Dre2_DIR:PATH=${re2_PKG_PATH} - -DgRPC_SSL_PROVIDER:STRING=package - -DOPENSSL_ROOT_DIR=${OpenSSL_ROOT} - -DgRPC_ZLIB_PROVIDER:STRING=package - -DZLIB_ROOT:PATH=${ZLIB_ROOT} - -DCMAKE_CXX_STANDARD=17 - -DCMAKE_POLICY_DEFAULT_CMP0074=NEW) - -if (gRPC_VERSION STREQUAL "1.54.2") - set(gRPC_CMAKE_OPTIONS - ${gRPC_CMAKE_OPTIONS} - -DgRPC_BUILD_ENVOY_API:BOOL=OFF - -DgRPC_BUILD_GOOGLEAPIS:BOOL=OFF - -DgRPC_BUILD_OPENCENSUS_PROTO:BOOL=OFF - -DgRPC_BUILD_XDS:BOOL=OFF) -endif() - -set(gRPC_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(gRPC_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(gRPC_LINK_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -set(gRPC_EXTRA_MSGS - ${c-ares_ROOT} - ${re2_ROOT} - ${absl_ROOT} - ${Protobuf_ROOT} - ${ZLIB_ROOT} - ${OpenSSL_ROOT}) - -if (gRPC_VERSION STREQUAL "1.65.4") - set(grpc_PATCHES - ${CMAKE_SOURCE_DIR}/third_party/patches/grpc/1.65.4/grpc_1_65_4_support_gcc_7_3.patch - ) -endif() - -add_thirdparty_lib(gRPC - URL ${gRPC_URL} - SHA256 ${gRPC_SHA256} - FAKE_SHA256 ${gRPC_FAKE_SHA256} - VERSION ${gRPC_VERSION} - CONF_OPTIONS ${gRPC_CMAKE_OPTIONS} - CXX_FLAGS ${gRPC_CXX_FLAGS} - C_FLAGS ${gRPC_C_FLAGS} - LINK_FLAGS ${gRPC_LINK_FLAGS} - EXTRA_MSGS ${gRPC_EXTRA_MSGS} - PATCHES ${grpc_PATCHES}) - -set(ENV{LD_LIBRARY_PATH} "${_ORG_LD_PATH}") - -set(gRPC_DIR ${gRPC_ROOT}) -find_package(gRPC ${gRPC_VERSION} REQUIRED) - -get_property(gRPC_INCLUDE_DIR TARGET gRPC::grpc++ PROPERTY INTERFACE_INCLUDE_DIRECTORIES) -include_directories(SYSTEM ${gRPC_INCLUDE_DIR}) - -# Generate gRPC protobuf cc files. -# -# SRCS is the output variable of the protobuf source files. -# -# HDRS is the output variable of the protobuf header files. -# -# TARGET_DIR is the generate cc files target directory. -# -# Additional optional arguments: -# -# PROTO_FILES ... -# gRPC protobuf source files to be compiled. -# -# SOURCE_ROOT -# gRPC protobuf source files root directory, default is ${CMAKE_CURRENT_SOURCE_DIR}, -# if protobuf source files are not in ${CMAKE_SOURCE_DIR}, this variable must be set. -# -# PROTO_DEPEND -# If the generated cc files need to depend some target this variable must be set. -function(GENERATE_GRPC_CPP SRCS HDRS TARGET_DIR) - set(options) - set(one_value_args SOURCE_ROOT PROTO_DEPEND) - set(multi_value_args PROTO_FILES) - cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) - - if (NOT ARG_PROTO_FILES) - message(FATAL_ERROR "GENERATE_GRPC_CPP() called without any proto files") - endif () - - if (NOT ARG_SOURCE_ROOT) - set(ARG_SOURCE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}) - endif() - - set(${SRCS}) - set(${HDRS}) - set(_PROTO_IMPORT_ARGS -I "${ARG_SOURCE_ROOT}") - - # Add protobuf import dir to avoid import report by protoc compiler. - foreach (_PROTO_FILE ${ARG_PROTO_FILES}) - get_filename_component(_ABS_FILE ${_PROTO_FILE} ABSOLUTE) - get_filename_component(_ABS_PATH ${_ABS_FILE} PATH) - list(FIND _PROTO_IMPORT_ARGS ${_ABS_PATH} _IMPORT_EXIST) - if (${_IMPORT_EXIST} EQUAL -1) - list(APPEND _PROTO_IMPORT_ARGS -I ${_ABS_PATH}) - endif() - endforeach() - - foreach (_PROTO_FILE ${ARG_PROTO_FILES}) - get_filename_component(_ABS_FILE ${_PROTO_FILE} ABSOLUTE) - get_filename_component(_ABS_DIR ${_PROTO_FILE} DIRECTORY) - get_filename_component(_PROTO_NAME ${_PROTO_FILE} NAME_WE) - get_filename_component(_PROTO_DIR ${_PROTO_FILE} PATH) - file(RELATIVE_PATH _REL_DIR ${ARG_SOURCE_ROOT} ${_ABS_DIR}) - file(MAKE_DIRECTORY ${TARGET_DIR}/${_REL_DIR}) - list(APPEND ${SRCS} ${TARGET_DIR}/${_REL_DIR}/${_PROTO_NAME}.pb.cc) - list(APPEND ${SRCS} ${TARGET_DIR}/${_REL_DIR}/${_PROTO_NAME}.grpc.pb.cc) - list(APPEND ${HDRS} ${TARGET_DIR}/${_REL_DIR}/${_PROTO_NAME}.pb.h) - list(APPEND ${HDRS} ${TARGET_DIR}/${_REL_DIR}/${_PROTO_NAME}.grpc.pb.h) - get_property(_GRPC_CPP_PLUGIN TARGET gRPC::grpc_cpp_plugin PROPERTY IMPORTED_LOCATION_RELEASE) - add_custom_command( - OUTPUT "${TARGET_DIR}/${_REL_DIR}/${_PROTO_NAME}.grpc.pb.cc" "${TARGET_DIR}/${_REL_DIR}/${_PROTO_NAME}.grpc.pb.h" - COMMAND ${CMAKE_COMMAND} -E env LD_LIBRARY_PATH=${gRPC_LIB_PATH}:${Protobuf_LIB_PATH}:$ENV{LD_LIBRARY_PATH} - $ - ARGS ${_PROTO_IMPORT_ARGS} - -I ${_PROTO_DIR} - --grpc_out ${TARGET_DIR} - --cpp_out ${TARGET_DIR} - --plugin=protoc-gen-grpc=$ - ${_ABS_FILE} - DEPENDS ${_ABS_FILE} - COMMENT "Running c++ grpc protocol compiler on ${_PROTO_FILE}" VERBATIM) - - if (ARG_PROTO_DEPEND) - add_custom_target(GRPC_LIB_DEPEND_${_PROTO_NAME} DEPENDS - "${TARGET_DIR}/${_PROTO_NAME}.grpc.pb.cc" - "${TARGET_DIR}/${_PROTO_NAME}.grpc.pb.h") - add_dependencies(${ARG_PROTO_DEPEND} GRPC_LIB_DEPEND_${_PROTO_NAME}) - endif() - endforeach () - - set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE) - set(${SRCS} ${${SRCS}} PARENT_SCOPE) - set(${HDRS} ${${HDRS}} PARENT_SCOPE) -endfunction() diff --git a/cmake/external_libs/gtest.cmake b/cmake/external_libs/gtest.cmake deleted file mode 100644 index 0e80e4c51c9e0514955478c7b0e5dc3fd62919f2..0000000000000000000000000000000000000000 --- a/cmake/external_libs/gtest.cmake +++ /dev/null @@ -1,26 +0,0 @@ -set(gtest_VERSION 1.12.1) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(gtest_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/release-1.12.1.zip") -else() - set(gtest_URL "https://gitee.com/mirrors/googletest/repository/archive/release-1.12.1.zip") -endif() -set(gtest_SHA256 "4f1037f17462dbcc4d715f2fc8212c03431ad06e7a4b73bb49b3f534a13b21f1") - -set(gtest_CMAKE_OPTIONS - -DCMAKE_BUILD_TYPE:STRING=Release) - -set(gtest_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -add_thirdparty_lib(GTest - URL ${gtest_URL} - SHA256 ${gtest_SHA256} - FAKE_SHA256 ${gtest_FAKE_SHA256} - VERSION ${gtest_VERSION} - CONF_OPTIONS ${gtest_CMAKE_OPTIONS} - CXX_FLAGS ${gtest_CXX_FLAGS}) - -set(CMAKE_PREFIX_PATH ${GTest_ROOT}) -find_package(GTest ${gtest_VERSION} CONFIG REQUIRED) - -get_property(GTEST_INCLUDE_DIRS TARGET GTest::gtest PROPERTY INTERFACE_INCLUDE_DIRECTORIES) -include_directories(SYSTEM ${GTEST_INCLUDE_DIRS}) diff --git a/cmake/external_libs/iconv.cmake b/cmake/external_libs/iconv.cmake deleted file mode 100644 index f713023e667aed78c4f8590ce83784af9c597cf3..0000000000000000000000000000000000000000 --- a/cmake/external_libs/iconv.cmake +++ /dev/null @@ -1,33 +0,0 @@ -set(iconv_VERSION 1.15) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(iconv_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/libiconv-1.15.tar.gz") -else() - set(iconv_URL "https://mirrors.aliyun.com/gnu/libiconv/libiconv-1.15.tar.gz") -endif() -set(iconv_SHA256 "ccf536620a45458d26ba83887a983b96827001e92a13847b45e4925cc8913178") - -set(iconv_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(iconv_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(iconv_LINK_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(iconv_OPTIONS - --enable-shared - --disable-static) - -add_thirdparty_lib(ICONV - URL ${iconv_URL} - SHA256 ${iconv_SHA256} - FAKE_SHA256 ${iconv_FAKE_SHA256} - VERSION ${iconv_VERSION} - CONF_OPTIONS ${iconv_OPTIONS} - C_FLAGS ${iconv_C_FLAGS} - CXX_FLAGS ${iconv_CXX_FLAGS} - LINK_FLAGS ${iconv_LINK_FLAGS} - TOOLCHAIN configure - PRE_CONFIGURE ${iconv_AUTOGEN}) - -find_library(ICONV - NAMES iconv - PATHS ${ICONV_ROOT} - PATH_SUFFIXES lib lib64 - REQUIRED - NO_DEFAULT_PATH) \ No newline at end of file diff --git a/cmake/external_libs/jemalloc.cmake b/cmake/external_libs/jemalloc.cmake deleted file mode 100644 index 9112aeeed12b73fc16b5bb5e24b4fe3fad66dca2..0000000000000000000000000000000000000000 --- a/cmake/external_libs/jemalloc.cmake +++ /dev/null @@ -1,79 +0,0 @@ -set(jemalloc_VERSION 5.3.0) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(jemalloc_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/5.3.0.zip") -else() - set(jemalloc_URL "https://gitee.com/mirrors/jemalloc/repository/archive/5.3.0.zip") -endif() -set(jemalloc_SHA256 "fcd383b168b72904f777e500631996366a633d1c40714f1601b7e739eb054613") - -set(jemalloc_CONF_OPTIONS - --with-malloc-conf=narenas:1,background_thread:true,max_background_threads:100,oversize_threshold:107374182400,lg_extent_max_active_fit:63 - --disable-zone-allocator - --without-export - --disable-shared - --enable-static - --disable-cxx - --enable-stats - --disable-initial-exec-tls - --with-jemalloc-prefix=datasystem_) - -if (DEFINED ENV{DS_JEMALLOC_LG_PAGE}) - message(STATUS "jemalloc custom page size=2^$ENV{DS_JEMALLOC_LG_PAGE}") - list(APPEND jemalloc_CONF_OPTIONS --with-lg-page=$ENV{DS_JEMALLOC_LG_PAGE}) -endif() - -set(jemalloc_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(jemalloc_LINK_FLAGS "-Wl,-z,now") - -set(jemalloc_AUTOGEN sh autogen.sh) - -set(_ORG_LD_FLAGS $ENV{LDFLAGS}) -set(ENV{LDFLAGS} "${THIRDPARTY_SAFE_FLAGS} ${_ORG_LD_FLAGS}") - -add_thirdparty_lib(Jemalloc - URL ${jemalloc_URL} - SHA256 ${jemalloc_SHA256} - FAKE_SHA256 ${jemalloc_FAKE_SHA256} - VERSION ${jemalloc_VERSION} - CONF_OPTIONS ${jemalloc_CONF_OPTIONS} - C_FLAGS ${jemalloc_C_FLAGS} - TOOLCHAIN configure - PRE_CONFIGURE ${jemalloc_AUTOGEN}) - -set(Jemalloc_DIR ${Jemalloc_ROOT}) -find_package(Jemalloc ${jemalloc_VERSION} REQUIRED) - -include_directories(${JEMALLOC_INCLUDE_DIR}) - -# build jemalloc shared library -set(JemallocShared_CONF_OPTIONS - --enable-shared - --disable-static - --disable-cxx - --enable-stats) - -if (DEFINED ENV{DS_JEMALLOC_LG_PAGE}) - list(APPEND JemallocShared_CONF_OPTIONS --with-lg-page=$ENV{DS_JEMALLOC_LG_PAGE}) -endif() - -if (SUPPORT_JEPROF) - message(STATUS "Support jemalloc memory profiling.") - add_compile_definitions(SUPPORT_JEPROF) - list(APPEND JemallocShared_CONF_OPTIONS --enable-prof) -endif () - -add_thirdparty_lib(JemallocShared - URL ${jemalloc_URL} - SHA256 ${jemalloc_SHA256} - FAKE_SHA256 ${jemalloc_FAKE_SHA256} - VERSION ${jemalloc_VERSION} - CONF_OPTIONS ${JemallocShared_CONF_OPTIONS} - C_FLAGS ${jemalloc_C_FLAGS} - LINK_FLAGS ${jemalloc_LINK_FLAGS} - TOOLCHAIN configure - PRE_CONFIGURE ${jemalloc_AUTOGEN}) - -set(ENV{LDFLAGS} ${_ORG_LD_FLAGS}) - -set(JemallocShared_DIR ${JemallocShared_ROOT}) -find_package(JemallocShared ${jemalloc_VERSION} REQUIRED) diff --git a/cmake/external_libs/libcurl.cmake b/cmake/external_libs/libcurl.cmake deleted file mode 100644 index ec0f34c0f2408deee9b5ade4cb5d352770d9c8f2..0000000000000000000000000000000000000000 --- a/cmake/external_libs/libcurl.cmake +++ /dev/null @@ -1,40 +0,0 @@ -set(curl_VERSION 8.8.0) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(curl_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/curl-8_8_0.zip") -else() - set(curl_URL "https://gitee.com/mirrors/curl/repository/archive/curl-8_8_0.zip") -endif() -set(curl_SHA256 "73c70c94f487c5ae26f9f27094249e40bb1667ae6c0406a75c3b11f86f0c1128") - -set(curl_CMAKE_OPTIONS - -DCMAKE_CXX_STANDARD=11 - -DOPENSSL_ROOT_DIR:PATH=${OpenSSL_ROOT}) - -set(curl_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -set(curl_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -if (curl_VERSION STREQUAL "8.8.0") - set(curl_PATCHES - ${CMAKE_SOURCE_DIR}/third_party/patches/curl/8.8.0/Backport-CVE-2024-6197-fix-CVE-2024-6197-for-curl-8.8.0-c.patch - ${CMAKE_SOURCE_DIR}/third_party/patches/curl/8.8.0/Backport-CVE-2024-6874-fix-CVE-2024-6874-for-curl-8.8.0-c.patch - ${CMAKE_SOURCE_DIR}/third_party/patches/curl/8.8.0/Backport-CVE-2024-7264-fix-CVE-2024-7264-for-curl-8.8.0-c.patch - ${CMAKE_SOURCE_DIR}/third_party/patches/curl/8.8.0/Backport-CVE-2024-8096-fix-CVE-2024-8096-for-curl-8.8.0-c.patch - ${CMAKE_SOURCE_DIR}/third_party/patches/curl/8.8.0/Backport-CVE-2024-9681-fix-CVE-2024-9681-for-curl-8.8.0-c.patch - ${CMAKE_SOURCE_DIR}/third_party/patches/curl/8.8.0/Backport-CVE-2024-11053-fix-CVE-2024-11053-for-curl-8.8.0-c.patch - ${CMAKE_SOURCE_DIR}/third_party/patches/curl/8.8.0/Backport-CVE-2025-0167-fix-CVE-2025-0167-for-curl-8.8.0-c.patch - ${CMAKE_SOURCE_DIR}/third_party/patches/curl/8.8.0/Backport-CVE-2025-0725-fix-CVE-2025-0725-for-curl-8.8.0-c.patch - ) -endif() - -add_thirdparty_lib(CURL - URL ${curl_URL} - SHA256 ${curl_SHA256} - FAKE_SHA256 ${curl_FAKE_SHA256} - VERSION ${curl_VERSION} - CONF_OPTIONS ${curl_CMAKE_OPTIONS} - CXX_FLAGS ${curl_CXX_FLAGS} - C_FLAGS ${curl_C_FLAGS} - PATCHES ${curl_PATCHES}) - -find_package(CURL ${curl_VERSION} REQUIRED PATHS ${CURL_ROOT} CONFIG) \ No newline at end of file diff --git a/cmake/external_libs/libzmq.cmake b/cmake/external_libs/libzmq.cmake deleted file mode 100644 index 7c9e90dac3032b864a6830a16ab367c16e02ae8f..0000000000000000000000000000000000000000 --- a/cmake/external_libs/libzmq.cmake +++ /dev/null @@ -1,123 +0,0 @@ -# Build the libs cppzmq depends -# libsodium -set(libsodium_VERSION 1.0.18) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(libsodium_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/1.0.18-RELEASE.zip") -else() - set(libsodium_URL "https://gitee.com/mirrors/libsodium/repository/archive/1.0.18-RELEASE.zip") -endif() -set(libsodium_SHA256 "682cb74c39915074bfe08abc7bdcf8c6c34325e35ad746d672b8a9e951d3d1c2") - -set(libsodium_CONF_OPTIONS - --enable-shared=false - --disable-pie) - -set(libsodium_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -add_thirdparty_lib(Sodium - URL ${libsodium_URL} - SHA256 ${libsodium_SHA256} - FAKE_SHA256 ${libsodium_FAKE_SHA256} - VERSION ${libsodium_VERSION} - CONF_OPTIONS ${libsodium_CONF_OPTIONS} - C_FLAGS ${libsodium_C_FLAGS} - TOOLCHAIN configure - EXTRA_MSGS ${DS_OPENSOURCE_DIR}) - -# libzmq -set(libzmq_VERSION 4.3.5) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(libzmq_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/v4.3.5.zip") -else() - set(libzmq_URL "https://gitee.com/mirrors/libzmq/repository/archive/v4.3.5.zip") -endif() -set(libzmq_SHA256 "e9a5db55f88f7214614b7e334d74ac501ad0726bcc54241205b7f4b11f132744") - -set(ENV{PKG_CONFIG_PATH} "${Sodium_ROOT}/lib/pkgconfig") -set(libzmq_CMAKE_OPTIONS - -DCMAKE_BUILD_TYPE:STRING=Release - -DZMQ_BUILD_TESTS:BOOL=OFF - -DENABLE_CURVE:BOOL=ON - -DWITH_LIBSODIUM:BOOL=ON - -DWITH_LIBSODIUM_STATIC:BOOL=ON) - -set(libzmq_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -set(libzmq_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -# compiler flags that are common across debug/release builds: -if (USE_SANITIZER) - string(TOUPPER ${USE_SANITIZER} USE_SANITIZER) - if (${USE_SANITIZER} STREQUAL "ADDRESS") - set(libzmq_CMAKE_OPTIONS "${libzmq_CMAKE_OPTIONS} -DENABLE_ASAN:BOOL=ON") - set(libzmq_C_FLAGS "${libzmq_C_FLAGS} -g3") - set(libzmq_CXX_FLAGS "${libzmq_CXX_FLAGS} -g3") - endif() -endif () - -set(libzmq_EXTRA_MSGS ${Sodium_ROOT}) - -add_thirdparty_lib(ZeroMQ - URL ${libzmq_URL} - SHA256 ${libzmq_SHA256} - FAKE_SHA256 ${libzmq_FAKE_SHA256} - VERSION ${libzmq_VERSION} - CONF_OPTIONS ${libzmq_CMAKE_OPTIONS} - CXX_FLAGS ${libzmq_CXX_FLAGS} - C_FLAGS ${libzmq_C_FLAGS} - EXTRA_MSGS ${libzmq_EXTRA_MSGS}) - -set(ZeroMQ_ROOT ${ZeroMQ_ROOT}) -find_package(ZeroMQ ${libzmq_VERSION} REQUIRED) -include_directories(${ZeroMQ_INCLUDE_DIR}) - -function(GENERATE_ZMQ_CPP ZMQ_PROTO_LIB_DEPEND source_files header_files target_directory proto_src_directory) - if (NOT ARGN) - message(SEND_ERROR "Error: ZMQ_GENERATE_CPP() called without any proto files") - return() - endif () - - set(${source_files}) - set(${header_files}) - foreach (file ${ARGN}) - get_filename_component(abs_file ${file} ABSOLUTE) - get_filename_component(file_name ${file} NAME_WE) - get_filename_component(file_dir ${file} PATH) - - list(APPEND ${source_files} "${target_directory}/${file_name}.pb.cc") - list(APPEND ${header_files} "${target_directory}/${file_name}.pb.h") - list(APPEND ${source_files} "${target_directory}/${file_name}.service.rpc.pb.cc") - list(APPEND ${header_files} "${target_directory}/${file_name}.service.rpc.pb.h") - list(APPEND ${source_files} "${target_directory}/${file_name}.stub.rpc.pb.cc") - list(APPEND ${header_files} "${target_directory}/${file_name}.stub.rpc.pb.h") - set(LD_LIB_PATH "${Protobuf_LIB_PATH}:$ENV{LD_LIBRARY_PATH}") - add_custom_command( - OUTPUT "${target_directory}/${file_name}.pb.cc" - "${target_directory}/${file_name}.pb.h" - "${target_directory}/${file_name}.service.rpc.pb.cc" - "${target_directory}/${file_name}.service.rpc.pb.h" - "${target_directory}/${file_name}.stub.rpc.pb.cc" - "${target_directory}/${file_name}.stub.rpc.pb.h" - COMMAND ${CMAKE_COMMAND} -E env LD_LIBRARY_PATH=${LD_LIB_PATH} - $ - ARGS -I ${file_dir} -I ${proto_src_directory} - --zmq_out ${target_directory} - --cpp_out ${target_directory} - --plugin=protoc-gen-zmq=$ - ${abs_file} - DEPENDS ${abs_file} "${CMAKE_SOURCE_DIR}/src/datasystem/common/rpc/plugin_generator/zmq_plugin.cpp" - COMMENT "Running c++ ZMQ compiler on ${file}" VERBATIM) - add_custom_target(ZMQ_PROTO_LIB_DEPEND_${file_name} DEPENDS - "${target_directory}/${file_name}.pb.cc" - "${target_directory}/${file_name}.pb.h" - "${target_directory}/${file_name}.service.rpc.pb.cc" - "${target_directory}/${file_name}.service.rpc.pb.h" - "${target_directory}/${file_name}.stub.rpc.pb.cc" - "${target_directory}/${file_name}.stub.rpc.pb.h") - add_dependencies(${ZMQ_PROTO_LIB_DEPEND} ZMQ_PROTO_LIB_DEPEND_${file_name}) - endforeach () - - set_source_files_properties(${${source_files}} ${${header_files}} PROPERTIES GENERATED TRUE) - set(${source_files} ${${source_files}} PARENT_SCOPE) - set(${header_files} ${${header_files}} PARENT_SCOPE) -endfunction() diff --git a/cmake/external_libs/nlohmann_json.cmake b/cmake/external_libs/nlohmann_json.cmake deleted file mode 100644 index 18980e51f225e2204c55b395efe6af26e7ae3e27..0000000000000000000000000000000000000000 --- a/cmake/external_libs/nlohmann_json.cmake +++ /dev/null @@ -1,24 +0,0 @@ -set(nlohmann_json_VERSION 3.11.3) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(nlohmann_json_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/v3.11.3.zip") -else() - set(nlohmann_json_URL "https://gitee.com/mirrors/nlohmann-json/repository/archive/v3.11.3.zip") -endif() -set(nlohmann_json_SHA256 "0deac294b2c96c593d0b7c0fb2385a2f4594e8053a36c52b11445ef4b9defebb") - -set(nlohmann_json_CMAKE_OPTIONS - -DJSON_BuildTests:BOOL=OFF - -DCMAKE_BUILD_TYPE:STRING=Release) - -set(nlohmann_json_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -add_thirdparty_lib(nlohmann_json - URL ${nlohmann_json_URL} - SHA256 ${nlohmann_json_SHA256} - FAKE_SHA256 ${nlohmann_json_FAKE_SHA256} - VERSION ${nlohmann_json_VERSION} - CONF_OPTIONS ${nlohmann_json_CMAKE_OPTIONS} - CXX_FLAGS ${nlohmann_json_CXX_FLAGS}) - -set(nlohmann_json_DIR ${nlohmann_json_ROOT}) -find_package(nlohmann_json ${nlohmann_json_VERSION} REQUIRED) \ No newline at end of file diff --git a/cmake/external_libs/openssl.cmake b/cmake/external_libs/openssl.cmake deleted file mode 100644 index addc43d11f78d0aa6686b874774b7acd3bc5dfa7..0000000000000000000000000000000000000000 --- a/cmake/external_libs/openssl.cmake +++ /dev/null @@ -1,28 +0,0 @@ -set(openssl_VERSION 1.1.1wa) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(openssl_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/OpenSSL_1_1_1wa.tar.gz") -else() - set(openssl_URL "https://gitee.com/openeuler/openssl/archive/refs/tags/OpenSSL_1_1_1wa.tar.gz") -endif() -set(openssl_SHA256 "09bcab2dfb4a10e425763bafe60fd253ef37a0893877cdc3982d8bbeaaaa8881") - -set(openssl_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -set(openssl_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -set(openssl_OPTIONS shared enable-ssl3 enable-ssl3-method no-buildtest-c++) - -add_thirdparty_lib(OpenSSL - URL ${openssl_URL} - SHA256 ${openssl_SHA256} - FAKE_SHA256 ${openssl_FAKE_SHA256} - VERSION ${openssl_VERSION} - TOOLCHAIN configure - CONF_OPTIONS ${openssl_OPTIONS} - CXX_FLAGS ${openssl_CXX_FLAGS} - C_FLAGS ${openssl_C_FLAGS} - PATCHES ${openssl_PATCHES}) - -set(OPENSSL_ROOT_DIR "${OpenSSL_ROOT}") -find_package(OpenSSL REQUIRED) -include_directories(SYSTEM ${OPENSSL_INCLUDE_DIR}) \ No newline at end of file diff --git a/cmake/external_libs/p2phccl.cmake b/cmake/external_libs/p2phccl.cmake deleted file mode 100644 index 6ec4dccba917ceaf16766dbdb00baf91d928b9e9..0000000000000000000000000000000000000000 --- a/cmake/external_libs/p2phccl.cmake +++ /dev/null @@ -1,36 +0,0 @@ -set(p2p-transfer_VERSION 0.1.0) -# Don't need to use DS_PACKAGE environments because it's not opensource third-party library. -set(p2p-transfer_URL "file://${CMAKE_SOURCE_DIR}/third_party/P2P-Transfer") -set(p2p-transfer_SHA256 "8054c2972aa4313d34236e8f128e8bae8807e690f70730cc10d24c390172aeda") - -set(p2p-transfer_CMAKE_OPTIONS - -DWITH_CUSTOM_PREFIX:BOOL=ON - -DSECUREC_ROOT_DIR:PATH=${SecureC_ROOT} - -DZLIB_ROOT_DIR:PATH=${ZLIB_ROOT} - -DProtobuf_ROOT_DIR:PATH=${Protobuf_ROOT} - -Dabsl_ROOT_DIR:PATH=${absl_ROOT} - -DCMAKE_CXX_STANDARD=17 - -DCMAKE_FIND_USE_CMAKE_SYSTEM_PATH:BOOL=FALSE - -DDatasystem_CMAKE_ROOT_DIR:PATH=${CMAKE_SOURCE_DIR}/cmake/ - -DCMAKE_BUILD_TYPE:STRING=Release) - -message(STATUS "Protobuf_ROOT: ${Protobuf_ROOT}") - -set(p2p-transfer_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -add_thirdparty_lib(p2p-transfer - URL ${p2p-transfer_URL} - SHA256 ${p2p-transfer_SHA256} - FAKE_SHA256 ${p2p-transfer_FAKE_SHA256} - VERSION ${p2p-transfer_VERSION} - CONF_OPTIONS ${p2p-transfer_CMAKE_OPTIONS} - CXX_FLAGS ${p2p-transfer_CXX_FLAGS} - C_FLAGS ${p2p-transfer_C_FLAGS} - PATCHES ${p2p-transfer_PATCHES}) - -set(p2p-transfer_DIR ${p2p-transfer_ROOT}) -find_package(p2p-transfer ${p2p-transfer_VERSION} REQUIRED) - -set(p2p-transfer_INCLUDE_DIR "${p2p-transfer_ROOT}/include") -message(STATUS "p2p-transfer include dir: ${p2p-transfer_INCLUDE_DIR}" ) -include_directories(SYSTEM ${p2p-transfer_INCLUDE_DIR}) \ No newline at end of file diff --git a/cmake/external_libs/pcre.cmake b/cmake/external_libs/pcre.cmake deleted file mode 100644 index fc61b7ab6a03cc22b1b6d62f0309de1a7cbe7381..0000000000000000000000000000000000000000 --- a/cmake/external_libs/pcre.cmake +++ /dev/null @@ -1,33 +0,0 @@ -set(pcre_VERSION 8.45) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(pcre_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/pcre-8.45.tar.gz") -else() - set(pcre_URL "https://nchc.dl.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.gz") -endif() -set(pcre_SHA256 "4e6ce03e0336e8b4a3d6c2b70b1c5e18590a5673a98186da90d4f33c23defc09") - -set(pcre_OPTIONS - --enable-shared - --disable-static) - -set(pcre_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(pcre_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(pcre_LINK_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -add_thirdparty_lib(PCRE - URL ${pcre_URL} - SHA256 ${pcre_SHA256} - FAKE_SHA256 ${pcre_FAKE_SHA256} - VERSION ${pcre_VERSION} - CONF_OPTIONS ${pcre_OPTIONS} - C_FLAGS ${pcre_C_FLAGS} - CXX_FLAGS ${pcre_CXX_FLAGS} - LINK_FLAGS ${pcre_LINK_FLAGS} - TOOLCHAIN configure) - -find_library(PCRE - NAMES pcre - PATHS ${PCRE_ROOT} - PATH_SUFFIXES lib lib64 - REQUIRED - NO_DEFAULT_PATH) diff --git a/cmake/external_libs/protobuf.cmake b/cmake/external_libs/protobuf.cmake deleted file mode 100644 index 0304d125e47a62c9cb81dae0e9f71b52d1d18f54..0000000000000000000000000000000000000000 --- a/cmake/external_libs/protobuf.cmake +++ /dev/null @@ -1,38 +0,0 @@ -# protobuf -set(protobuf_VERSIONS 3.25.5) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(protobuf_URLS "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/v3.25.5.tar.gz") -else() - set(protobuf_URLS "https://gitee.com/mirrors/protobuf_source/repository/archive/v3.25.5.tar.gz") -endif() -set(protobuf_SHA256S "2ed51794f7a1f9da3e4d8ede931ff55206e33b5e49b876966c7b2af523913e54") - -adjuice_thirdparty_version(protobuf) - -set(protobuf_CMAKE_OPTIONS - -Dprotobuf_BUILD_TESTS:BOOL=OFF - -Dprotobuf_BUILD_SHARED_LIBS:BOOL=OFF - -DCMAKE_BUILD_TYPE:STRING=Release - -Dprotobuf_ABSL_PROVIDER:STRING=package - -Dabsl_DIR:PATH=${absl_PKG_PATH} - -DCMAKE_CXX_STANDARD=17 - -DCMAKE_SKIP_RPATH:BOOL=TRUE) - -set(protobuf_CXX_FLAGS "${THIRDPARTY_SAFE_FLAGS} -fPIE -pie -fPIC") - -set(protobuf_PATCHES - ${CMAKE_SOURCE_DIR}/third_party/patches/protobuf/3.25.5/protobuf_support_gcc_7_3.patch) - -add_thirdparty_lib(Protobuf - URL ${protobuf_URL} - SHA256 ${protobuf_SHA256} - FAKE_SHA256 ${protobuf_FAKE_SHA256} - VERSION ${protobuf_VERSION} - CONF_OPTIONS ${protobuf_CMAKE_OPTIONS} - CXX_FLAGS ${protobuf_CXX_FLAGS} - PATCHES ${protobuf_PATCHES}) - -find_package(Protobuf 25.5.0 REQUIRED PATHS ${Protobuf_ROOT} CONFIG) - -get_property(Protobuf_INCLUDE_DIR TARGET protobuf::libprotobuf PROPERTY INTERFACE_INCLUDE_DIRECTORIES) -include_directories(SYSTEM ${Protobuf_INCLUDE_DIR}) diff --git a/cmake/external_libs/pybind11.cmake b/cmake/external_libs/pybind11.cmake deleted file mode 100644 index b824cb96c99be6f07f5cb06f4098824495eb1ad0..0000000000000000000000000000000000000000 --- a/cmake/external_libs/pybind11.cmake +++ /dev/null @@ -1,41 +0,0 @@ -set(pybind11_VERSION 2.10.3) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(pybind11_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/v2.10.3.zip") -else() - set(pybind11_URL "https://gitee.com/mirrors/pybind11/repository/archive/v2.10.3.zip") -endif() -set(pybind11_SHA256 "bea74700d4c841e5da499a1fccb680ad61716a4f0e94940ce372c92fbdb375c7") - -set(pybind11_CMAKE_OPTIONS - -DPYBIND11_TEST:BOOL=OFF - -DPYBIND11_LTO_CXX_FLAGS:BOOL=FALSE - -DCMAKE_BUILD_TYPE:STRING=Release) - -set(pybind11_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -add_thirdparty_lib(pybind11 - URL ${pybind11_URL} - SHA256 ${pybind11_SHA256} - FAKE_SHA256 ${pybind11_FAKE_SHA256} - VERSION ${pybind11_VERSION} - CONF_OPTIONS ${pybind11_CMAKE_OPTIONS} - CXX_FLAGS ${pybind11_CXX_FLAGS}) - -if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.15") - set(Python3_FIND_STRATEGY LOCATION) -endif() - -find_package(Python3 COMPONENTS Interpreter Development) -if (NOT Python3_FOUND) - message(FATAL_ERROR "Python interpreter or development not found!") -else() - set(PYTHON_VERSION "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}") - message(STATUS "Found python interpreter, version: ${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}.${Python3_VERSION_PATCH}") - message(STATUS "Found python interpreter, path: ${Python3_EXECUTABLE}") -endif() - -set(pybind11_DIR ${pybind11_ROOT}) -set(PYBIND11_PYTHON_VERSION ${PYTHON_VERSION} CACHE STRING "") -find_package(pybind11 ${pybind11_VERSION} REQUIRED) - -include_directories(${pybind11_INCLUDE_DIRS}) \ No newline at end of file diff --git a/cmake/external_libs/re2.cmake b/cmake/external_libs/re2.cmake deleted file mode 100644 index 659b7fa49682cedf3b13426a33b4a3e722eebeb4..0000000000000000000000000000000000000000 --- a/cmake/external_libs/re2.cmake +++ /dev/null @@ -1,51 +0,0 @@ -# re2 -set(re2_VERSION 2024-07-02) -if ("$ENV{DS_PACKAGE}" STREQUAL "") - if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(re2_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/2024-07-02.zip") - else() - set(re2_URL "https://gitee.com/mirrors/re2/repository/archive/2024-07-02.zip") - endif() - set(re2_SHA256 "20f5af5320da5a704125eaec5965ddc0cfa86fb420575a9f9f04c5cef905ba93") -else() - gen_thirdparty_pkg(re2 re2_URL re2_SHA256 re2_FAKE_SHA256 re2_VERSION) -endif() - -if (EXISTS ${absl_ROOT}/lib64) - set(absl_PKG_PATH ${absl_ROOT}/lib64/cmake/absl) -else() - set(absl_PKG_PATH ${absl_ROOT}/lib/cmake/absl) -endif() - -set(re2_CMAKE_OPTIONS - -DCMAKE_BUILD_TYPE:STRING=Release - -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=TRUE - -DRE2_BUILD_TESTING:BOOL=OFF - -DCMAKE_CXX_STANDARD=17 - -Dabsl_DIR:PATH=${absl_PKG_PATH}) - -set(re2_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -add_thirdparty_lib(re2 - URL ${re2_URL} - SHA256 ${re2_SHA256} - FAKE_SHA256 ${re2_FAKE_SHA256} - VERSION ${re2_VERSION} - CONF_OPTIONS ${re2_CMAKE_OPTIONS} - CXX_FLAGS ${re2_CXX_FLAGS}) - -if (EXISTS ${re2_ROOT}/lib64) - set(re2_PKG_PATH ${re2_ROOT}/lib64/cmake/re2) -else() - set(re2_PKG_PATH ${re2_ROOT}/lib/cmake/re2) -endif() - -if (DEFINED EXPORT_TO_USER_ENV_FILE) - file(APPEND "${EXPORT_TO_USER_ENV_FILE}" - "set(re2_PKG_PATH ${re2_PKG_PATH})" "\n" - ) -endif() - -find_package(re2 REQUIRED) -get_property(re2_INCLUDE_DIR TARGET re2::re2 PROPERTY INTERFACE_INCLUDE_DIRECTORIES) -include_directories(${re2_INCLUDE_DIR}) \ No newline at end of file diff --git a/cmake/external_libs/rocksdb.cmake b/cmake/external_libs/rocksdb.cmake deleted file mode 100644 index 28dd7970b6de7c8ce4e59c1158f72b826d6b6bf4..0000000000000000000000000000000000000000 --- a/cmake/external_libs/rocksdb.cmake +++ /dev/null @@ -1,35 +0,0 @@ -set(rocksdb_VERSION 7.10.2) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(rocksdb_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/v7.10.2.zip") -else() - set(rocksdb_URL "https://gitee.com/mirrors/rocksdb/repository/archive/v7.10.2.zip") -endif() -set(rocksdb_SHA256 "8f655269fac91da27032914377ecb63eeab9eccc5da5d6894482115f71287e26") - -set(rocksdb_CMAKE_OPTIONS - -DCMAKE_BUILD_TYPE:STRING=Release - -DWITH_TESTS:BOOL=OFF - -DFAIL_ON_WARNINGS:BOOL=OFF - -DFORCE_SSE42:BOOL=OFF - -DPORTABLE:BOOL=ON - -DUSE_RTTI:BOOL=ON - -DWITH_GFLAGS:BOOL=OFF) - -set(rocksdb_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -set(rocksdb_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -add_thirdparty_lib(RocksDB - URL ${rocksdb_URL} - SHA256 ${rocksdb_SHA256} - FAKE_SHA256 ${rocksdb_FAKE_SHA256} - VERSION ${rocksdb_VERSION} - CONF_OPTIONS ${rocksdb_CMAKE_OPTIONS} - CXX_FLAGS ${rocksdb_CXX_FLAGS} - C_FLAGS ${rocksdb_C_FLAGS}) - -set(RocksDB_DIR ${RocksDB_ROOT}) -find_package(RocksDB ${rocksdb_VERSION} REQUIRED) - -get_property(RocksDB_INCLUDE_DIR TARGET RocksDB::rocksdb PROPERTY INTERFACE_INCLUDE_DIRECTORIES) -include_directories(${RocksDB_INCLUDE_DIR}) \ No newline at end of file diff --git a/cmake/external_libs/sdk_c_obs.cmake b/cmake/external_libs/sdk_c_obs.cmake deleted file mode 100644 index f0127eab004dd2a35cfe81d359170af0bfa13098..0000000000000000000000000000000000000000 --- a/cmake/external_libs/sdk_c_obs.cmake +++ /dev/null @@ -1,40 +0,0 @@ -set(obs_VERSION 3.24.3) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(obs_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/v3.24.3.zip") -else() - set(obs_URL "https://gitee.com/mirrors/huaweicloud-sdk-c-obs/repository/archive/v3.24.3.zip") -endif() -set(obs_SHA256 "ed744c92494d2d7fd171e776abfef627ac7bdd0e24910a207e83d3887cafb2bd") - -set(obs_CMAKE_OPTIONS - -DCMAKE_BUILD_TYPE:STRING=Release - -DCURL_ROOT_DIR::PATH=${CURL_ROOT} - -DSECUREC_ROOT_DIR:PATH=${SecureC_ROOT} - -DOPENSSL_ROOT_DIR=${OpenSSL_ROOT} - -DICONV_ROOT_DIR=${ICONV_ROOT} - -DXML2_ROOT_DIR=${XML2_ROOT} - -DPCRE_ROOT_DIR=${PCRE_ROOT} - -DCJSON_ROOT_DIR=${CJSON_ROOT} - -DZLIB_ROOT=${ZLIB_ROOT} - -DSPDLOG_ROOT_DIR=${SPDLOG_ROOT}) - -set(obs_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(obs_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(obs_LINK_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -set(obs_PATCHES ${CMAKE_SOURCE_DIR}/third_party/patches/obs/3.24.3/obs-sdk-cmake-install.patch) - -add_thirdparty_lib(OBS - URL ${obs_URL} - SHA256 ${obs_SHA256} - FAKE_SHA256 ${obs_FAKE_SHA256} - VERSION ${obs_VERSION} - CONF_OPTIONS ${obs_CMAKE_OPTIONS} - CXX_FLAGS ${obs_CXX_FLAGS} - C_FLAGS ${obs_C_FLAGS} - LINK_FLAGS ${obs_LINK_FLAGS} - PATCHES ${obs_PATCHES}) - -set(OBS_DIR ${OBS_ROOT}) -find_package(OBS ${obs_VERSION} REQUIRED) -include_directories(${OBS_INCLUDE_DIR}) \ No newline at end of file diff --git a/cmake/external_libs/securec.cmake b/cmake/external_libs/securec.cmake deleted file mode 100644 index 3fa8149444eb20e74de412f550f79a52ee38d7dd..0000000000000000000000000000000000000000 --- a/cmake/external_libs/securec.cmake +++ /dev/null @@ -1,24 +0,0 @@ -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(securec_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/v1.1.16.tar.gz") -else() - set(securec_URL "https://gitee.com/openeuler/libboundscheck/archive/refs/tags/v1.1.16.tar.gz") -endif() -set(securec_SHA256 "aee8368ef04a42a499edd5bfebce529e7f32dd138bfed383d316e48af4e45d2c") - -set(securec_VERSION v1.1.16) - -set(securec_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -set(securec_PATCHES ${CMAKE_SOURCE_DIR}/third_party/patches/securec/libboundscheck-cmake-support.patch) - -add_thirdparty_lib(SecureC - URL ${securec_URL} - SHA256 ${securec_SHA256} - VERSION ${securec_VERSION} - C_FLAGS ${securec_C_FLAGS} - PATCHES ${securec_PATCHES}) - -set(CMAKE_PREFIX_PATH ${SecureC_ROOT}) -find_package(SecureC REQUIRED) - -include_directories(${SECUREC_INCLUDE_DIR}) \ No newline at end of file diff --git a/cmake/external_libs/spdlog.cmake b/cmake/external_libs/spdlog.cmake deleted file mode 100644 index be44d40c9adba75c84593e3456f8bc13907cf3f6..0000000000000000000000000000000000000000 --- a/cmake/external_libs/spdlog.cmake +++ /dev/null @@ -1,40 +0,0 @@ -set(spdlog_VERSION 1.12.0) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(spdlog_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/v1.12.0.zip") -else() - set(spdlog_URL "https://gitee.com/mirror-luyi/spdlog/repository/archive/v1.12.0.zip") -endif() -set(spdlog_SHA256 "a0a22ed8e4932cf5f7abc354fc96d20217a8b45471e732d5e672cc01979fe588") - -set(spdlog_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(spdlog_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(spdlog_LINK_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -set(spdlog_CMAKE_OPTIONS - -DCMAKE_BUILD_TYPE:STRING=Release - -DSPDLOG_BUILD_SHARED:BOOL=ON) - -set(spdlog_PATCHES ${CMAKE_SOURCE_DIR}/third_party/patches/spdlog/change-filename.patch) - -add_thirdparty_lib(SPDLOG - URL ${spdlog_URL} - SHA256 ${spdlog_SHA256} - FAKE_SHA256 ${spdlog_FAKE_SHA256} - VERSION ${spdlog_VERSION} - C_FLAGS ${spdlog_C_FLAGS} - CXX_FLAGS ${spdlog_CXX_FLAGS} - LINK_FLAGS ${spdlog_LINK_FLAGS} - CONF_OPTIONS ${spdlog_CMAKE_OPTIONS} - PATCHES ${spdlog_PATCHES}) - -find_library(SPDLOG - NAMES ds-spdlog - PATHS ${SPDLOG_ROOT} - PATH_SUFFIXES lib lib64 - REQUIRED - NO_DEFAULT_PATH) - -set(CMAKE_PREFIX_PATH ${SPDLOG_ROOT}) -find_package(spdlog ${spdlog_VERSION} REQUIRED) -get_property(spdlog_INCLUDE_DIR TARGET spdlog::spdlog PROPERTY INTERFACE_INCLUDE_DIRECTORIES) -include_directories(SYSTEM ${spdlog_INCLUDE_DIR}) diff --git a/cmake/external_libs/tbb.cmake b/cmake/external_libs/tbb.cmake deleted file mode 100644 index c68d24f5451fceb5da2b3166cb54dab8180792e8..0000000000000000000000000000000000000000 --- a/cmake/external_libs/tbb.cmake +++ /dev/null @@ -1,60 +0,0 @@ -set(tbb_VERSION 2020.3-5.oe2203sp1) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(tbb_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/v2020.3.zip") -else() - set(tbb_URL "https://gitee.com/mirrors/tbb/repository/archive/v2020.3.zip") -endif() -set(tbb_SHA256 "58654b47f145e619cddfdd1fdf2dd36b6db85d7e644bce8f2b278eed8b1b28b7") - -if ("${tbb_VERSION}" STREQUAL "2021.5.0") - set(tbb_TOOLCHAIN "cmake") -else () - set(tbb_TOOLCHAIN "make") -endif () - -string(FIND "${tbb_VERSION}" "2020.3" tbb_need_patch) -if (NOT found EQUAL -1) - set(tbb_PATCHES ${CMAKE_SOURCE_DIR}/third_party/patches/tbb/2020.3/soft-link.patch) -endif () - -set(tbb_CMAKE_OPTIONS - -DTBB_TEST:BOOL=OFF - -DCMAKE_BUILD_TYPE:STRING=Release) - -set(tbb_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -set(tbb_LINK_FLAGS "-Wl,-z,relro,-z,now") - -add_thirdparty_lib(TBB - URL ${tbb_URL} - SHA256 ${tbb_SHA256} - FAKE_SHA256 ${tbb_FAKE_SHA256} - VERSION ${tbb_VERSION} - CONF_OPTIONS ${tbb_CMAKE_OPTIONS} - CXX_FLAGS ${tbb_CXX_FLAGS} - LINK_FLAGS ${tbb_LINK_FLAGS} - TOOLCHAIN ${tbb_TOOLCHAIN} - PATCHES ${tbb_PATCHES}) - -set(TBB_DIR ${TBB_ROOT}) -find_package(TBB REQUIRED) - -if (EXISTS "${TBB_INCLUDE_DIR}/oneapi/tbb/version.h") - file(STRINGS - "${TBB_INCLUDE_DIR}/oneapi/tbb/version.h" - TBB_VERSION_CONTENTS - REGEX "VERSION") -else() - #only read the start of the file - file(STRINGS - "${TBB_INCLUDE_DIR}/tbb/tbb_stddef.h" - TBB_VERSION_CONTENTS - REGEX "VERSION") -endif() - -string(REGEX REPLACE - ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1" - TBB_INTERFACE_VERSION "${TBB_VERSION_CONTENTS}") - -add_compile_definitions(TBB_INTERFACE_VERSION=${TBB_INTERFACE_VERSION}) -include_directories(SYSTEM ${TBB_INCLUDE_DIR}) \ No newline at end of file diff --git a/cmake/external_libs/ub.cmake b/cmake/external_libs/ub.cmake deleted file mode 100644 index 64ce772b46a84361a738b7b72d28a8d2cd45b813..0000000000000000000000000000000000000000 --- a/cmake/external_libs/ub.cmake +++ /dev/null @@ -1,22 +0,0 @@ -if (DOWNLOAD_UB) - # set the url and archive name to be downloaded - set(UB_ARCHIVE_DATETIME 20240124) # format YYYYMMDDhhmmss - if ("${UB_URL}" STREQUAL "" AND "${UB_SHA256}" STREQUAL "") - if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") - # wait for modify - set(UB_URL "xxx") - set(UB_SHA256 "xxx") - elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") - # wait for modify - set(UB_URL "xxx") - set(UB_SHA256 "xxx") - else() - message(FATAL_ERROR "Unsupported system processor: ${CMAKE_SYSTEM_PROCESSOR}") - endif() - endif() - - ADD_THIRDPARTY_LIB(UB - URL ${UB_URL} - SHA256 ${UB_SHA256} - VERSION ${UB_ARCHIVE_DATETIME}) -endif() \ No newline at end of file diff --git a/cmake/external_libs/urma.cmake b/cmake/external_libs/urma.cmake deleted file mode 100644 index d854c98b25193f6f945f118f7659a69b5978cc79..0000000000000000000000000000000000000000 --- a/cmake/external_libs/urma.cmake +++ /dev/null @@ -1,26 +0,0 @@ -if (DOWNLOAD_UB) - set(URMA_INCLUDE_LOCATION ${UB_ROOT}/include) - - set(URMA_LIB_LOCATION ${UB_ROOT}/lib64) - set(URMA_IP_IB_LIB_LOCATION ${UB_ROOT}/lib64/urma) -else () - if (NOT URMA_INCLUDE_LOCATION) - set(URMA_INCLUDE_LOCATION "/usr/include/umdk") - endif() - - if (NOT URMA_LIB_LOCATION) - set(URMA_LIB_LOCATION "/usr/lib64") - endif() - - if (NOT URMA_IP_IB_LIB_LOCATION) - set(URMA_IP_IB_LIB_LOCATION "/usr/lib64/urma") - endif() -endif() - -find_package(URMA REQUIRED) - -include_directories(${URMA_INCLUDE_DIR}) -include_directories(${URMA_INCLUDE_DIR}/common) - -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-missing-field-initializers -Wno-unused-parameter") -add_definitions(-DUSE_URMA) \ No newline at end of file diff --git a/cmake/external_libs/xml2.cmake b/cmake/external_libs/xml2.cmake deleted file mode 100644 index 26b4201073d23a014a3546ae0c665dd3ab0fe0ab..0000000000000000000000000000000000000000 --- a/cmake/external_libs/xml2.cmake +++ /dev/null @@ -1,36 +0,0 @@ -set(xml2_VERSION 2.9.12) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(xml2_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/v2.9.12.zip") -else() - set(xml2_URL "https://gitee.com/mirrors/libxml2/repository/archive/v2.9.12.zip") -endif() -set(xml2_SHA256 "e3e25e5357e896e9c5ba368d158d908027b1a84d2f700ecab60746af8c3c2bf7") - -set(xml2_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(xml2_CXX_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(xml2_LINK_FLAGS ${THIRDPARTY_SAFE_FLAGS}) -set(xml2_OPTIONS - --enable-shared - --disable-static - --with-python=no) - -set(xml2_AUTOGEN sh autogen.sh) - -add_thirdparty_lib(XML2 - URL ${xml2_URL} - SHA256 ${xml2_SHA256} - FAKE_SHA256 ${xml2_FAKE_SHA256} - VERSION ${xml2_VERSION} - CONF_OPTIONS ${xml2_OPTIONS} - C_FLAGS ${xml2_C_FLAGS} - CXX_FLAGS ${xml2_CXX_FLAGS} - LINK_FLAGS ${xml2_LINK_FLAGS} - TOOLCHAIN configure - PRE_CONFIGURE ${xml2_AUTOGEN}) - -find_library(XML2 - NAMES xml2 - PATHS ${XML2_ROOT} - PATH_SUFFIXES lib lib64 - REQUIRED - NO_DEFAULT_PATH) \ No newline at end of file diff --git a/cmake/external_libs/zlib.cmake b/cmake/external_libs/zlib.cmake deleted file mode 100644 index 6f827935fd34e35dc107bc3904c10098e00dfe85..0000000000000000000000000000000000000000 --- a/cmake/external_libs/zlib.cmake +++ /dev/null @@ -1,32 +0,0 @@ -set(zlib_VERSION 1.3.1) -if (NOT "$ENV{DS_LOCAL_LIBS_DIR}" STREQUAL "") - set(zlib_URL "$ENV{DS_LOCAL_LIBS_DIR}/opensource_third_party/zlib-v1.3.1.tar.gz") -else() - set(zlib_URL "https://gitee.com/mirrors/zlib/repository/archive/v1.3.1.tar.gz") -endif() -set(zlib_SHA256 "4208eb8a8ba5703831123b06c9bbadf780e678a9972eb00ecce57e6f87b30f36") - -set(zlib_CMAKE_OPTIONS - -DCMAKE_BUILD_TYPE:STRING=Release) - -set(zlib_C_FLAGS ${THIRDPARTY_SAFE_FLAGS}) - -if (zlib_VERSION STREQUAL "1.2.13") - set(zlib_PATCHES - ${CMAKE_SOURCE_DIR}/third_party/patches/zlib/Backport-CVE-2023-45853-Reject-overflows-of-zip-header-fields-in-mi-c.patch) -endif() - -add_thirdparty_lib(ZLIB - URL ${zlib_URL} - SHA256 ${zlib_SHA256} - FAKE_SHA256 ${zlib_FAKE_SHA256} - VERSION ${zlib_VERSION} - CONF_OPTIONS ${zlib_CMAKE_OPTIONS} - C_FLAGS ${zlib_C_FLAGS} - PATCHES ${zlib_PATCHES}) - -set(ZLIB_ROOT ${ZLIB_ROOT}) -set(ZLIB_DIR ${ZLIB_ROOT}) -find_package(ZLIB ${zlib_VERSION} REQUIRED) - -include_directories(${ZLIB_INCLUDE_DIRS}) \ No newline at end of file diff --git a/cmake/modules/FindAscend.cmake b/cmake/modules/FindAscend.cmake deleted file mode 100644 index 737be5ef9ce06af90e34b41a2a7779c08c98d34f..0000000000000000000000000000000000000000 --- a/cmake/modules/FindAscend.cmake +++ /dev/null @@ -1,32 +0,0 @@ -# - Find ASCEND (acl_base.h, acl.h, libascendcl.so ) -# This module defines -# ASCEND_INCLUDE_DIR, directory containing headers -# ASCEND_LIBRARY, Location of libascendcl's shared -# ASCEND_FOUND, whether ascend has been found - -find_path(ASCEND_INCLUDE_DIR acl/acl.h - DOC "Path to the ASCEND header file" - HINTS ${Ascend_ROOT}/include - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -find_library(ASCEND_LIBRARY ${CMAKE_SHARED_LIBRARY_PREFIX}ascendcl${CMAKE_SHARED_LIBRARY_SUFFIX} - ${CMAKE_SHARED_LIBRARY_PREFIX}hccl${CMAKE_SHARED_LIBRARY_SUFFIX} - DOC "Path to Ascend library" - HINTS ${Ascend_ROOT}/lib64 - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -find_library(HCCL_LIBRARY - ${CMAKE_SHARED_LIBRARY_PREFIX}hccl${CMAKE_SHARED_LIBRARY_SUFFIX} - DOC "Path to HCCL library" - HINTS ${Ascend_ROOT}/lib64 - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -message("ascend lib: ${ASCEND_LIBRARY}") -message("hccl lib: ${HCCL_LIBRARY}") - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Ascend REQUIRED_VARS - ASCEND_LIBRARY HCCL_LIBRARY ASCEND_INCLUDE_DIR) diff --git a/cmake/modules/FindJemalloc.cmake b/cmake/modules/FindJemalloc.cmake deleted file mode 100644 index 7fa540262bf80d27015388d871f86bd800e7eb7b..0000000000000000000000000000000000000000 --- a/cmake/modules/FindJemalloc.cmake +++ /dev/null @@ -1,24 +0,0 @@ -# - Find Jemalloc (jemalloc.h, libjemalloc.a) -# This module defines -# JEMALLOC_INCLUDE_DIR, directory containing headers -# JEMALLOC_STATIC_LIBRARY, Location of jemalloc's static library -# JEMALLOC_FOUND, whether jemalloc has been found - -find_path(JEMALLOC_INCLUDE_DIR jemalloc/jemalloc.h - DOC "Path to the jemalloc header file" - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -find_library(JEMALLOC_STATIC_LIBRARY ${CMAKE_STATIC_LIBRARY_PREFIX}jemalloc${CMAKE_STATIC_LIBRARY_SUFFIX} - DOC "jemalloc is a general purpose malloc(3) implementation that emphasizes fragmentation avoidance and scalable concurrency support." - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -find_library(JEMALLOC_PIC_LIBRARY jemalloc_pic - DOC "jemalloc is a general purpose malloc(3) implementation that emphasizes fragmentation avoidance and scalable concurrency support." - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Jemalloc REQUIRED_VARS - JEMALLOC_PIC_LIBRARY JEMALLOC_STATIC_LIBRARY JEMALLOC_INCLUDE_DIR) \ No newline at end of file diff --git a/cmake/modules/FindJemallocShared.cmake b/cmake/modules/FindJemallocShared.cmake deleted file mode 100644 index 3a9a058def913144ed1442427562149167e1f951..0000000000000000000000000000000000000000 --- a/cmake/modules/FindJemallocShared.cmake +++ /dev/null @@ -1,11 +0,0 @@ -# - Find Jemalloc (libjemalloc.so) -# This module defines -# JEMALLOC_SHARED_LIBRARY, Location of jemalloc's shared library - -find_library(JEMALLOC_SHARED_LIBRARY ${CMAKE_SHARED_LIBRARY_PREFIX}jemalloc${CMAKE_SHARED_LIBRARY_SUFFIX} - DOC "jemalloc is a general purpose malloc(3) implementation that emphasizes fragmentation avoidance and scalable concurrency support." - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(JemallocShared REQUIRED_VARS JEMALLOC_SHARED_LIBRARY) \ No newline at end of file diff --git a/cmake/modules/FindSecureC.cmake b/cmake/modules/FindSecureC.cmake deleted file mode 100644 index 9ce75ad3d1b2a3aa609a33bf39dec6d4eb816e83..0000000000000000000000000000000000000000 --- a/cmake/modules/FindSecureC.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# - Find SercureC (securec.h, libsecurec.so) -# This module defines -# SECUREC_INCLUDE_DIR, directory containing headers -# SECUREC_LIBRARY, Location of libsecurec's shared or static library -# SECUREC_FOUND, whether securec has been found - -find_path(SECUREC_INCLUDE_DIR securec.h - DOC "Path to the securec header file" - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -find_library(SECUREC_LIBRARY securec - DOC "Secure function library" - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(SecureC REQUIRED_VARS - SECUREC_LIBRARY SECUREC_INCLUDE_DIR) \ No newline at end of file diff --git a/cmake/modules/FindSodium.cmake b/cmake/modules/FindSodium.cmake deleted file mode 100644 index 9bbf7ae6342b783bbab8c9b956341891138511e6..0000000000000000000000000000000000000000 --- a/cmake/modules/FindSodium.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# - Find libsodium (sodium.h, libsodium.a) -# This module defines -# SODIUM_INCLUDE_DIR, directory containing headers -# SODIUM_STATIC_LIBRARY, Location of libsodium's static library -# SODIUM_FOUND, whether libsodium has been found - -find_path(SODIUM_INCLUDE_DIR sodium.h - DOC "Path to the libsodium header file" - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -find_library(SODIUM_STATIC_LIBRARY ${CMAKE_STATIC_LIBRARY_PREFIX}sodium${CMAKE_STATIC_LIBRARY_SUFFIX} - DOC "libsodium static library" - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Sodium REQUIRED_VARS - SODIUM_INCLUDE_DIR SODIUM_STATIC_LIBRARY) \ No newline at end of file diff --git a/cmake/modules/FindTBB.cmake b/cmake/modules/FindTBB.cmake deleted file mode 100644 index 1311ec2ba100141b5fec1170064c7426b0171f58..0000000000000000000000000000000000000000 --- a/cmake/modules/FindTBB.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# - Find TBB (tbb.h, libtbb.so libtbbmalloc.so libtbbmalloc_proxy.so) -# This module defines -# TBB_INCLUDE_DIR, directory containing headers -# TBB_LIBRARY, Location of libtbb's shared -# TBB_FOUND, whether tbb has been found - -find_path(TBB_INCLUDE_DIR tbb/tbb.h - DOC "Path to the TBB header file" - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -find_library(TBB_LIBRARY tbb - DOC "Tbb library" - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(TBB REQUIRED_VARS - TBB_LIBRARY TBB_INCLUDE_DIR) \ No newline at end of file diff --git a/cmake/modules/FindURMA.cmake b/cmake/modules/FindURMA.cmake deleted file mode 100644 index b74b683d3c4ad8d47fe165ef7bc7d6f9c21fc931..0000000000000000000000000000000000000000 --- a/cmake/modules/FindURMA.cmake +++ /dev/null @@ -1,45 +0,0 @@ -# - Find URMA (urma_types.h, liburma.so, liburma_ip.so) -# This module defines -# URMA_INCLUDE_DIR, directory containing urma headers -# URMA_LIBRARY, Location of liburma's shared -# URMA_IP_LIBRARY, Location of liburma_ip's shared -# URMA_FOUND, whether URMA has been found - -find_path(URMA_INCLUDE_DIR urma_api.h - PATHS ${URMA_INCLUDE_LOCATION} - DOC "Path to the urma api header file" - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -find_path(URMA_INCLUDE_DIR urma_types.h - PATHS ${URMA_INCLUDE_LOCATION} - DOC "Path to the urma header file" - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -find_library(URMA_LIBRARY urma - PATHS ${URMA_LIB_LOCATION} - DOC "URMA library" - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -find_library(URMA_IP_LIBRARY urma_ip - PATHS ${URMA_IP_IB_LIB_LOCATION} - DOC "URMA IP library" - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -find_library(URMA_IB_LIBRARY urma_ib - PATHS ${URMA_IP_IB_LIB_LOCATION} - DOC "URMA IB library" - NO_CMAKE_SYSTEM_PATH - NO_SYSTEM_ENVIRONMENT_PATH) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(URMA REQUIRED_VARS - URMA_LIBRARY URMA_IP_LIBRARY URMA_IB_LIBRARY URMA_INCLUDE_DIR) - -message(STATUS "URMA_LIBRARY=${URMA_LIBRARY}") -message(STATUS "URMA_IP_LIBRARY=${URMA_IP_LIBRARY}") -message(STATUS "URMA_IB_LIBRARY=${URMA_IB_LIBRARY}") -message(STATUS "URMA_INCLUDE_DIR=${URMA_INCLUDE_DIR}") diff --git a/cmake/options.cmake b/cmake/options.cmake deleted file mode 100644 index f04cb6ad50a0663e5869f3a4729e4ccc2f94b987..0000000000000000000000000000000000000000 --- a/cmake/options.cmake +++ /dev/null @@ -1,6 +0,0 @@ -option(WITH_TESTS "Enable run datasystem testcases" OFF) -option(BUILD_COVERAGE "Build code for coverage statistics" OFF) -option(FAIL_ON_WARNINGS "Treat compile warnings as errors" ON) -option(ENABLE_PERF "Generate perf point logs" OFF) -option(BUILD_PYTHON_API "Build python api" OFF) -option(ENABLE_STRIP "Discard symbols from object files" OFF) diff --git a/cmake/package.cmake b/cmake/package.cmake deleted file mode 100644 index 72fadc144ef0ea69210ab6659661d033904a5066..0000000000000000000000000000000000000000 --- a/cmake/package.cmake +++ /dev/null @@ -1,251 +0,0 @@ -############################################################ -# Datasystem targets and config files. -############################################################ -set(DATASYSTEM_CONFIG_PATH sdk/cpp/lib/cmake/${PROJECT_NAME}) - -configure_package_config_file(cmake/config.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake - INSTALL_DESTINATION ${DATASYSTEM_CONFIG_PATH} - NO_CHECK_REQUIRED_COMPONENTS_MACRO) -configure_file(${CMAKE_SOURCE_DIR}/cmake/version.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake @ONLY) - -install(EXPORT ${PROJECT_NAME}Targets - FILE ${PROJECT_NAME}Targets.cmake - DESTINATION ${DATASYSTEM_CONFIG_PATH}) - -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake - DESTINATION ${DATASYSTEM_CONFIG_PATH}) - -############################################################ -# Datasystem rpc libraries. -############################################################ -set(RPC_LIB_PATH "${ZeroMQ_LIB_PATH}/libzmq.so*") -if (BUILD_WITH_URMA) - list(APPEND RPC_LIB_PATH "${URMA_LIB_LOCATION}/liburma*.so*") - list(APPEND URMA_LIB_PATH "${URMA_IP_IB_LIB_LOCATION}/liburma_*.so*") -endif() - -############################################################ -# Datasystem header files and share libraries. -############################################################ -set(DATASYSTEM_SDK_USER_INCLUDEDIR sdk/cpp/include) -set(DATASYSTEM_SDK_USER_LIBPATH sdk/cpp/lib) - -if (NOT ENABLE_PERF) - install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/datasystem - DESTINATION ${DATASYSTEM_SDK_USER_INCLUDEDIR} - FILES_MATCHING - PATTERN "*.h" - PATTERN "perf_client.h" EXCLUDE) -else() - install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/datasystem - DESTINATION ${DATASYSTEM_SDK_USER_INCLUDEDIR}) -endif () - - -set(datasystem_INSTALL_LIBPATH ${DATASYSTEM_SDK_USER_LIBPATH}) -install_datasystem_target(datasystem EXPORT_NAME DatasystemTargets) - -if (BUILD_HETERO) - # Set the permission of acl_plugin to 440 - install(TARGETS acl_plugin - DESTINATION ${DATASYSTEM_SDK_USER_LIBPATH} - PERMISSIONS OWNER_READ GROUP_READ) -endif() - -set(SDK_SPDLOG_LIB - "${SPDLOG_LIB_PATH}/libds-spdlog.so*" -) - -set(SDK_PROTOBUF_LIB - "${Protobuf_LIB_PATH}/libprotobuf.so*" -) -set(SDK_PROTOC_LIB - "${Protobuf_LIB_PATH}/libprotoc.so*" -) - -set(SDK_USER_LIB_PATTERNS - ${SDK_PROTOBUF_LIB} - ${SDK_PROTOC_LIB}) - -set(SDK_USER_LIB_PATTERNS - ${SDK_USER_LIB_PATTERNS} - ${SDK_SPDLOG_LIB} - "${SecureC_LIB_PATH}/libsecurec.so" - "${TBB_LIB_PATH}/libtbb.so*" - "${gRPC_LIB_PATH}/libgrpc.so*" - "${gRPC_LIB_PATH}/libgrpc++.so*" - "${gRPC_LIB_PATH}/libgpr.so*" - "${gRPC_LIB_PATH}/libupb*" - "${gRPC_LIB_PATH}/libutf8*" - "${gRPC_LIB_PATH}/libaddress_sorting.so*" - "${OpenSSL_LIB_PATH}/libssl.so*" - "${OpenSSL_LIB_PATH}/libcrypto.so*" - ${RPC_LIB_PATH} -) - -install_file_pattern( - PATH_PATTERN ${SDK_USER_LIB_PATTERNS} - DEST_DIR ${DATASYSTEM_SDK_USER_LIBPATH} -) - -############################################################ -# Datasystem python share libraries. -############################################################ -if (BUILD_PYTHON_API) - # install target first to change install rpath to $ORIGIN - set(DEPEND_TARGETS - datasystem - ds_client_py) - - if (BUILD_HETERO) - list(APPEND DEPEND_TARGETS acl_plugin) - endif() - - set(PYTHON_LIBPATH ${CMAKE_BINARY_DIR}/python_lib) - # Install third party libraries we need. - set(PYTHON_LIB_PATTERNS - ${SDK_SPDLOG_LIB} - ${SDK_PROTOBUF_LIB} - "${SecureC_LIB_PATH}/libsecurec.so" - "${TBB_LIB_PATH}/libtbb.so*" - "${OpenSSL_LIB_PATH}/libssl.so*" - ${RPC_LIB_PATH} - ) - - package_python(datasystem - PYTHON_SRC_DIR ${CMAKE_SOURCE_DIR}/python - CMAKE_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/sdk - DEPEND_TARGETS ${DEPEND_TARGETS} - THIRDPATRY_LIBS_PATTERN ${PYTHON_LIB_PATTERNS}) -endif () - -############################################################ -# Datasystem go header files and share libraries. -############################################################ -if (BUILD_GO_API) - set(DATASYSTEM_GO_INCLUDEDIR sdk/go/include) - set(DATASYSTEM_GO_LIBPATH sdk/go/lib) - set(DATASYSTEM_GO_PATH sdk) - - install(DIRECTORY ${CMAKE_SOURCE_DIR}/go - DESTINATION ${DATASYSTEM_GO_PATH} - FILES_MATCHING PATTERN "*") - - install(FILES ${CMAKE_SOURCE_DIR}/src/datasystem/c_api/status_definition.h - ${CMAKE_SOURCE_DIR}/src/datasystem/c_api/state_cache_c_wrapper.h - ${CMAKE_SOURCE_DIR}/src/datasystem/c_api/object_cache_c_wrapper.h - ${CMAKE_SOURCE_DIR}/src/datasystem/c_api/utilC.h - ${CMAKE_SOURCE_DIR}/src/datasystem/c_api/cipher.h - DESTINATION ${DATASYSTEM_GO_INCLUDEDIR}/datasystem/c_api) - - set(datasystem_c_INSTALL_LIBPATH ${DATASYSTEM_GO_LIBPATH}) - install_datasystem_target(datasystem_c) - - set(datasystem_INSTALL_LIBPATH ${DATASYSTEM_GO_LIBPATH}) - install_datasystem_target(datasystem) - - set(GO_LIB_PATTERNS - ${SDK_SPDLOG_LIB} - ${SDK_PROTOBUF_LIB} - ${SDK_PROTOC_LIB} - "${SecureC_LIB_PATH}/libsecurec.so" - "${TBB_LIB_PATH}/libtbb.so*" - "${OpenSSL_LIB_PATH}/libssl.so*" - "${OpenSSL_LIB_PATH}/libcrypto.so*" - "${gRPC_LIB_PATH}/libgrpc.so*" - "${gRPC_LIB_PATH}/libgrpc++.so*" - "${gRPC_LIB_PATH}/libgpr.so*" - "${gRPC_LIB_PATH}/libupb*" - "${gRPC_LIB_PATH}/libutf8*" - "${gRPC_LIB_PATH}/libaddress_sorting.so*" - "${SPDLOG_LIB_PATH}/libds-spdlog.so*" - ${RPC_LIB_PATH} - ) - - install_file_pattern( - PATH_PATTERN ${GO_LIB_PATTERNS} - DEST_DIR ${DATASYSTEM_GO_LIBPATH} - ) -endif () - - - -############################################################ -# Datasystem bin and depends libs. -############################################################ -set(DATASYSTEM_SERVICE_BINPATH service) -set(DATASYSTEM_SERVICE_LIBPATH service/lib) - -set(datasystem_worker_INSTALL_BINPATH ${DATASYSTEM_SERVICE_BINPATH}) -install_datasystem_target(datasystem_worker) - -set(SERVICE_LIB_PATTERNS - ${SDK_SPDLOG_LIB} - ${SDK_PROTOBUF_LIB} - ${SDK_PROTOC_LIB} - "${SecureC_LIB_PATH}/libsecurec.so" - "${TBB_LIB_PATH}/libtbb.so*" - "${OpenSSL_LIB_PATH}/libssl.so*" - "${OpenSSL_LIB_PATH}/libcrypto.so*" - "${CURL_LIB_PATH}/libcurl.so*" - "${JemallocShared_LIB_PATH}/libjemalloc.so*" - "${gRPC_LIB_PATH}/libgrpc.so*" - "${gRPC_LIB_PATH}/libgrpc++.so*" - "${gRPC_LIB_PATH}/libgpr.so*" - "${gRPC_LIB_PATH}/libupb*" - "${gRPC_LIB_PATH}/libutf8*" - "${gRPC_LIB_PATH}/libaddress_sorting.so*" - "${OBS_LIB_PATH}/libeSDKLogAPI.so" - "${OBS_LIB_PATH}/libeSDKOBS.so" - "${OBS_LIB_PATH}/libiconv.so*" - "${OBS_LIB_PATH}/libpcre.so*" - "${OBS_LIB_PATH}/libxml2.so*" - ${RPC_LIB_PATH} - "${OBS_LIB_PATH}/libcjson.so*" -) - -install_file_pattern( - PATH_PATTERN ${SERVICE_LIB_PATTERNS} - DEST_DIR ${DATASYSTEM_SERVICE_LIBPATH} -) - -if (BUILD_WITH_URMA) - install_file_pattern( - PATH_PATTERN ${URMA_LIB_PATH} - DEST_DIR ${DATASYSTEM_SERVICE_LIBPATH}/urma - PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ - ) -endif() - -############################################################ -# Datasystem deploy scripts generate zone. -############################################################ -if (BUILD_PYTHON_API) - # install target first to change install rpath to $ORIGIN - set(DEPEND_TARGETS - datasystem - ds_client_py) - - if (BUILD_HETERO) - list(APPEND DEPEND_TARGETS acl_plugin) - endif() - - set(PYTHON_LIBPATH ${CMAKE_BINARY_DIR}/python_lib) - - set(PYTHON_LIB_PATTERNS - ${SDK_SPDLOG_LIB} - ${SDK_PROTOBUF_LIB} - "${SecureC_LIB_PATH}/libsecurec.so" - "${TBB_LIB_PATH}/libtbb.so*" - "${CURL_LIB_PATH}/libcurl.so*" - ${RPC_LIB_PATH} - ) - - package_datasystem_wheel(datasystem - CMAKE_INSTALL_PATH ${CMAKE_INSTALL_PREFIX} - DEPEND_TARGETS ${DEPEND_TARGETS} - THIRDPATRY_LIBS_PATTERN ${PYTHON_LIB_PATTERNS}) -endif() - diff --git a/cmake/scripts/CleanBuildRpath.cmake b/cmake/scripts/CleanBuildRpath.cmake deleted file mode 100644 index 3c6255ea6a8313db52f5128fc4781c01066b9953..0000000000000000000000000000000000000000 --- a/cmake/scripts/CleanBuildRpath.cmake +++ /dev/null @@ -1,10 +0,0 @@ -# CMake script for cleaning build rpath of build rpath. -if (NOT BIN_FILE OR NOT EXISTS "${BIN_FILE}" OR IS_SYMLINK "${BIN_FILE}") - message(FATAL_ERROR "BIN_FILE not specified, not exist or is symlink!") -endif() - -# Remove the build rpath. -file(RPATH_REMOVE FILE "${BIN_FILE}") - -# Check rpath remove success or not. -file(RPATH_CHECK FILE "${BIN_FILE}" RPATH "") \ No newline at end of file diff --git a/cmake/scripts/GenerateHashHeader.cmake b/cmake/scripts/GenerateHashHeader.cmake deleted file mode 100644 index 5b3162b6827b730f04d1679fe96eae9e5462d830..0000000000000000000000000000000000000000 --- a/cmake/scripts/GenerateHashHeader.cmake +++ /dev/null @@ -1,19 +0,0 @@ -# CMake script for calculating the SHA256 hash value of the file and store it in the header file for invoking during running. -set(PATH "${CMAKE_CURRENT_BINARY_DIR}/libacl_plugin.so") -set(OUTFILE "${CMAKE_CURRENT_BINARY_DIR}/acl_plugin_sha256.h") -set(HASH_VAR "ACL_PLUGIN_SHA256") -set(GUARD_NAME "ACL_PLUGIN_SHA256_H") - -# Calculate the SHA256 hash value of a file. -file(SHA256 ${PATH} HASH_VALUE) - -# Generate the header file content -set(HEADER_CONTENT "#ifndef ${GUARD_NAME}\n") -set(HEADER_CONTENT "${HEADER_CONTENT}#define ${GUARD_NAME}\n") -set(HEADER_CONTENT "${HEADER_CONTENT}\n") -set(HEADER_CONTENT "${HEADER_CONTENT}#define ${HASH_VAR} \"${HASH_VALUE}\"\n") -set(HEADER_CONTENT "${HEADER_CONTENT}\n") -set(HEADER_CONTENT "${HEADER_CONTENT}#endif // ${GUARD_NAME}\n") - -# Write the hash value to the header file. -file(WRITE ${OUTFILE} "${HEADER_CONTENT}") \ No newline at end of file diff --git a/cmake/scripts/GoogleTestToCTest.cmake b/cmake/scripts/GoogleTestToCTest.cmake deleted file mode 100644 index 9c1b42fd45f6186f486d532bfad9cd7a3aaad224..0000000000000000000000000000000000000000 --- a/cmake/scripts/GoogleTestToCTest.cmake +++ /dev/null @@ -1,167 +0,0 @@ -# CMake script for adding googletest to CTest. -set(CTEST_FILE_CONTENTS "") - -function (_COMMAND_APPEND CMD) - set(_ARGS "") - foreach(_ARG ${ARGN}) - if (_ARG MATCHES "[^-./:a-zA-Z0-9_]") - set(_ARGS "${_ARGS} [==[${_ARG}]==]") - else() - set(_ARGS "${_ARGS} ${_ARG}") - endif() - endforeach() - set(CTEST_FILE_CONTENTS "${CTEST_FILE_CONTENTS}${CMD}(${_ARGS})\n" PARENT_SCOPE) -endfunction() - -if (NOT EXISTS ${TEST_EXECUTABLE}) - message(FATAL_ERROR "Test executable not found: ${TEST_EXECUTABLE}!") -endif() - -if (TEST_ENVIRONMENTS) - string(REGEX REPLACE " " ";" TEST_ENVIRONMENTS ${TEST_ENVIRONMENTS}) -endif() - -# 1. Run test executable to get the test list. -set(_COMMAND_PREFIX) -if (TEST_ENVIRONMENTS) - set(_COMMAND_PREFIX ${CMAKE_COMMAND} -E env ${TEST_ENVIRONMENTS}) -endif() - -execute_process(COMMAND ${_COMMAND_PREFIX} ${TEST_EXECUTABLE} --gtest_list_tests - TIMEOUT 50 - RESULTS_VARIABLE _RESULT - OUTPUT_VARIABLE _OUTPUT) - -if (NOT _RESULT EQUAL "0") - message(FATAL_ERROR "Run ${TEST_EXECUTABLE} failed!\n" - "Command prefix: \n" - " ${_COMMAND_PREFIX}\n" - "Return variable: \n" - " ${_RESULT}\n" - "Output variable: \n" - " ${_OUTPUT}") -endif() - -# Convert to list -string(REGEX REPLACE "\n" ";" _OUTPUT ${_OUTPUT}) - -set(_LLT_LABEL "") -if (${TEST_EXECUTABLE} MATCHES ".*(object|kv).*") - set(_LLT_LABEL "object") -elseif (${TEST_EXECUTABLE} MATCHES ".*stream.*") - set(_LLT_LABEL "stream") -endif() - -if (${TEST_EXECUTABLE} MATCHES ".*tests/st.*") - set(_LLT_LABEL "${_LLT_LABEL} st") -elseif (${TEST_EXECUTABLE} MATCHES ".*tests/ut.*") - set(_LLT_LABEL "${_LLT_LABEL} ut") -endif() - -set(L0_CNT 0) -set(L1_CNT 0) -set(L2_CNT 0) - -set(LEVEL_LABELS a b c d e f g h i j k l m n o p) -list(LENGTH LEVEL_LABELS LIST_LENGTH) -function(SET_LEVEL_SUFFIX NUM) - math(EXPR RESULT "${NUM} % ${LIST_LENGTH}") - list(GET LEVEL_LABELS ${RESULT} _LEVEL_SUFFIX) - set(_LEVEL_SUFFIX "${_LEVEL_SUFFIX}" PARENT_SCOPE) -endfunction() - - -# 2. Parse the output variable and write to CTest file. -# -# Google test list testcases rule: -# 1. Test suite begin with letters and end with "." -# 2. Test name begin with 2 spaces -# 3. Test name with multi parameters end with "/${num} # GetParam() = ..." -# 4. Test suite with multi parameters end with ". # TypeParam() = ..." -# -# Example: -# -# MultiGCSNodesTest. -# TestNASWriter -# DISABLED_TestNASTruncate -# FuseReadWriteParamTest/FuseFileSystemReadWriteTest. -# TestOpenDir/0 # GetParam() = 4-byte object <00-00 00-00> -# TestOpenDir/1000 # GetParam() = 4-byte object -# TestReadFile/0 # GetParam() = 4-byte object <00-00 00-00> -# InodeStoreTest/0. # TypeParam = datasystem::master::KvInodeStore -# TestAddGetDeleteInode -# TestAddGetDeleteChild -# InodeStoreTest/1. # TypeParam = datasystem::master::KvHeapInodeStore -# TestAddGetDeleteInode -# TestAddGetDeleteChild -# ... -# -# What we need to do: -# 1. Get the test suite, remove invalid characters such as spaces and comments. -# 2. Get the test name, remove invalid characters such as spaces and comments. -# 3. Identify disabled cases amd add DISABLED property. -# 4. Generate test command such as `add_test` and `set_tests_properties`. - -foreach(_TEST_LINE ${_OUTPUT}) - if (_TEST_LINE MATCHES "^ ") - # Test name handle. - string(REGEX REPLACE " +" "" _TEST_NAME ${_TEST_LINE}) - if (_TEST_NAME MATCHES "/[0-9]+#GetParam") - string(REGEX REPLACE "#.*" "" _TEST_NAME ${_TEST_NAME}) - endif() - - string(REGEX REPLACE "^(DISABLED_|EXCLUSIVE_|LEVEL1_|LEVEL2_)+" "" _PRETTY_NAME "${_TEST_NAME}") - - # Add testcase to CTest, command: - # add_test(NAME COMMAND [...] [WORKING_DIRECTORY ]) - _command_append(add_test - "${_PRETTY_SUITE}${_PRETTY_NAME}" - ${_COMMAND_PREFIX} ${TEST_EXECUTABLE} "--gtest_filter=${_TEST_SUITE}${_TEST_NAME}" "--gtest_also_run_disabled_tests") - - if (NOT _TEST_SUITE MATCHES "^DISABLED_" AND NOT _TEST_NAME MATCHES "^DISABLED_") - # If test suite or name contain "LEVEL1_"/"LEVEL2_", we need to set "level1"/"level2" label, otherwise, set "level0". - if (_TEST_SUITE MATCHES "LEVEL1_" OR _TEST_NAME MATCHES "LEVEL1_") - set(_LEVEL "1") - math(EXPR L1_CNT "${L1_CNT} + 1") - set(_COUNT ${L1_CNT}) - set_level_suffix(${L1_CNT}) - elseif (_TEST_SUITE MATCHES "LEVEL2_" OR _TEST_NAME MATCHES "LEVEL2_") - set(_LEVEL "2") - math(EXPR L2_CNT "${L2_CNT} + 1") - set(_COUNT ${L2_CNT}) - else() - set(_LEVEL "0") - math(EXPR L0_CNT "${L0_CNT} + 1") - set(_COUNT ${L0_CNT}) - endif() - set_level_suffix(${_COUNT}) - set(_LABEL "${_LLT_LABEL} level${_LEVEL}${_LEVEL_SUFFIX}") - _command_append(set_tests_properties - "${_PRETTY_SUITE}${_PRETTY_NAME}" - PROPERTIES LABELS "${_LABEL}" - ) - endif() - - # If test suite or name begin with "DISABLED_", we need to set disable property. - if (_TEST_SUITE MATCHES "^DISABLED_" OR _TEST_NAME MATCHES "^DISABLED_") - _command_append(set_tests_properties - "${_PRETTY_SUITE}${_PRETTY_NAME}" - PROPERTIES DISABLED TRUE) - elseif (_TEST_SUITE MATCHES "EXCLUSIVE_" OR _TEST_NAME MATCHES "EXCLUSIVE_") - _command_append(set_tests_properties - "${_PRETTY_SUITE}${_PRETTY_NAME}" - PROPERTIES RUN_SERIAL TRUE) - endif() - else() - # Test suite handle. - if (_TEST_LINE MATCHES "#") - string(REGEX REPLACE "\\. +#.*" "." _TEST_SUITE ${_TEST_LINE}) - else() - set(_TEST_SUITE ${_TEST_LINE}) - endif() - - string(REGEX REPLACE "^(DISABLED_|EXCLUSIVE_|LEVEL1_|LEVEL2_)+" "" _PRETTY_SUITE "${_TEST_SUITE}") - endif() -endforeach() - -file(WRITE ${CTEST_FILE} "${CTEST_FILE_CONTENTS}") \ No newline at end of file diff --git a/cmake/scripts/PackageDatasystem.cmake.in b/cmake/scripts/PackageDatasystem.cmake.in deleted file mode 100644 index d70a5f8b8a4f694d00eb0ce6dc0666d1aaefc06b..0000000000000000000000000000000000000000 --- a/cmake/scripts/PackageDatasystem.cmake.in +++ /dev/null @@ -1,40 +0,0 @@ -# Run python setup.py to generate wheel file, rename wheel file and copy it to install path. - -# Set the variable passed from configure_file in package.cmake/package_fc.cmake -set(GIT_HASH "@GIT_HASH@") -set(Python3_EXECUTABLE @Python3_EXECUTABLE@) -set(PYTHON_LIBPATH @PYTHON_LIBPATH@) -set(DATASYSTEM_WHEEL_PATH @DATASYSTEM_WHEEL_PATH@) -set(DATASYSTEM_SETUP_PATH @DATASYSTEM_SETUP_PATH@) -set(CMAKE_INSTALL_PATH @ARG_CMAKE_INSTALL_PATH@) -set(ENV{COMMIT_ID} "${GIT_HASH}") - -# Copy all libs file and exclude sym file. -message("cmake install prefix: ${CMAKE_INSTALL_PREFIX}") -if(EXISTS ${PYTHON_LIBPATH}) - file(COPY ${PYTHON_LIBPATH}/ - DESTINATION ${DATASYSTEM_WHEEL_PATH}/lib - REGEX ".*sym$" EXCLUDE) -endif() -file(GLOB_RECURSE FILE_LIST ${CMAKE_INSTALL_PREFIX}/sdk/cpp/lib/*so*) -file(WRITE "${DATASYSTEM_WHEEL_PATH}/sdk_lib_list" "") -foreach(FILE ${FILE_LIST}) - get_filename_component(FILENAME ${FILE} NAME) - file(APPEND "${DATASYSTEM_WHEEL_PATH}/sdk_lib_list" "${FILENAME}\n") -endforeach() - -find_program(CMAKE_STRIP NAMES strip) -file(GLOB SO_FILES "${DATASYSTEM_WHEEL_PATH}/lib/*.so*") -foreach(SO_FILE ${SO_FILES}) - execute_process(COMMAND ${CMAKE_STRIP} ${SO_FILE}) -endforeach() - -# Run python setup.py bdist_whell to generate origin wheel file. -execute_process(COMMAND ${Python3_EXECUTABLE} setup.py bdist_wheel - WORKING_DIRECTORY ${DATASYSTEM_SETUP_PATH}) -file(GLOB ORIGIN_WHEEL "dist/dist/*.whl") - - -file(COPY ${ORIGIN_WHEEL} DESTINATION ${CMAKE_INSTALL_PATH}/) -# Remove temporary package path -file(REMOVE_RECURSE ${DATASYSTEM_SETUP_PATH}) \ No newline at end of file diff --git a/cmake/scripts/PackagePython.cmake.in b/cmake/scripts/PackagePython.cmake.in deleted file mode 100644 index 918c5f1a07516204b6eefdb3b8c9271e415251c5..0000000000000000000000000000000000000000 --- a/cmake/scripts/PackagePython.cmake.in +++ /dev/null @@ -1,33 +0,0 @@ -# Run python setup.py to generate wheel file, rename wheel file and copy it to install path. - -# Set the variable passed from configure_file in package.cmake/package_fc.cmake -set(GIT_HASH "@GIT_HASH@") -set(Python3_EXECUTABLE @Python3_EXECUTABLE@) -set(PYTHON_LIBPATH @PYTHON_LIBPATH@) -set(PYTHON_PACKAGE_LIBPATH @PYTHON_PACKAGE_LIBPATH@) -set(PYTHON_PACKAGE_PATH @PYTHON_PACKAGE_PATH@) -set(TARGET_WHEEL @TARGET_WHEEL@) -set(CMAKE_INSTALL_PATH @ARG_CMAKE_INSTALL_PATH@) -set(ENV{COMMIT_ID} "${GIT_HASH}") - -# Copy all libs file and exclude sym file. -message("cmake install prefix: ${CMAKE_INSTALL_PREFIX}") -file(COPY ${PYTHON_LIBPATH}/ - DESTINATION ${PYTHON_PACKAGE_LIBPATH}/lib - REGEX ".*sym$" EXCLUDE) - -find_program(CMAKE_STRIP NAMES strip) -file(GLOB SO_FILES "${PYTHON_PACKAGE_LIBPATH}/lib/*.so*") -foreach(SO_FILE ${SO_FILES}) - execute_process(COMMAND ${CMAKE_STRIP} ${SO_FILE}) -endforeach() - -file(RENAME ${PYTHON_PACKAGE_LIBPATH}/setup.py ${PYTHON_PACKAGE_PATH}/setup.py) -# Run python setup.py bdist_whell to generate origin wheel file. -execute_process(COMMAND ${Python3_EXECUTABLE} setup.py bdist_wheel - WORKING_DIRECTORY ${PYTHON_PACKAGE_PATH}) -file(GLOB ORIGIN_WHEEL "python_api/dist/*.whl") -# Rename origin wheel file and move to install path. -file(COPY ${ORIGIN_WHEEL} DESTINATION ${CMAKE_INSTALL_PATH}) -# Remove temporary package path -file(REMOVE_RECURSE ${PYTHON_PACKAGE_PATH}) \ No newline at end of file diff --git a/cmake/scripts/StripAndGenHash.cmake b/cmake/scripts/StripAndGenHash.cmake deleted file mode 100644 index bc8794942cab686084ea0c8ede81352cdc00384a..0000000000000000000000000000000000000000 --- a/cmake/scripts/StripAndGenHash.cmake +++ /dev/null @@ -1,51 +0,0 @@ -if (NOT SRC_PATH_PATTERN OR NOT DST_PATH) - message(FATAL_ERROR "Can't find SRC_PATH_PATTERN or DST_PATH") -endif () - -find_program(Objcopy_EXECUTABLE objcopy) - -string(REPLACE "," ";" SRC_PATH_PATTERN_LIST ${SRC_PATH_PATTERN}) - -foreach(PATTERN ${SRC_PATH_PATTERN_LIST}) - # support match pattern - FILE(GLOB_RECURSE SRC_PATH_LIST ${PATTERN}) - list(APPEND SRC_PATH_LISTS ${SRC_PATH_LIST}) -endforeach() - -foreach(SRC_PATH ${SRC_PATH_LISTS}) - if (NOT EXISTS ${SRC_PATH}) - message(FATAL_ERROR "file ${SRC_PATH} not exists") - endif () - - if (NOT Objcopy_EXECUTABLE) - message(FATAL_ERROR "command objcopy not found") - endif () - - get_filename_component(FILE_NAME ${SRC_PATH} NAME) - get_filename_component(BASE_NAME ${SRC_PATH} NAME_WE) - - file(COPY ${SRC_PATH} DESTINATION ${DST_PATH}) - - # Symlink don't need to strip - if (STRIP_LIB AND NOT IS_SYMLINK ${SRC_PATH}) - message("strip lib ${SRC_PATH}") - execute_process( - COMMAND ${Objcopy_EXECUTABLE} --only-keep-debug ${DST_PATH}/${FILE_NAME} ${DST_PATH}/${FILE_NAME}.sym - ) - - execute_process( - COMMAND ${Objcopy_EXECUTABLE} --add-gnu-debuglink=${DST_PATH}/${FILE_NAME}.sym ${DST_PATH}/${FILE_NAME} - ) - - execute_process( - COMMAND ${Objcopy_EXECUTABLE} --strip-all ${DST_PATH}/${FILE_NAME} - ) - endif () - - # If don't need to generate so.properties, set IGNORE_SO_PROPERTY to TRUE - if (NOT IGNORE_SO_PROPERTY AND NOT IS_SYMLINK ${SRC_PATH}) - file(SHA256 ${DST_PATH}/${FILE_NAME} FILE_HASH) - file(APPEND ${DST_PATH}/so.properties "${BASE_NAME}=${FILE_NAME}\n") - file(APPEND ${DST_PATH}/so.properties "${BASE_NAME}.hash=${FILE_HASH}\n") - endif () -endforeach() \ No newline at end of file diff --git a/cmake/util.cmake b/cmake/util.cmake deleted file mode 100644 index 2dcd2aebdb9a168284d48747325e2355229c34ec..0000000000000000000000000000000000000000 --- a/cmake/util.cmake +++ /dev/null @@ -1,1017 +0,0 @@ -include(FetchContent) - -set(THIRDPARTY_SAFE_FLAGS "-fPIC -D_FORTIFY_SOURCE=2 -O2 -fstack-protector-strong -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,--build-id=none -Wl,-z,relro,-z,noexecstack,-z,now ${EXT_FLAGS}") - -if (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "aarch64" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "9.1.0") - set(EXT_FLAGS "-mtune=tsv110 -march=armv8-a") - message("Add compiler flags ${EXT_FLAGS} for aarch64") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXT_FLAGS}") -endif() - -list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules) - -# We provide a way to cache the third party libs to avoid the repeated third-party compilation. -# User can configure the cache by setting the environment variables or CMake configuration, and -# the priority of the CMake configuration is higher. -if(NOT DS_OPENSOURCE_DIR) - if(DEFINED ENV{DS_OPENSOURCE_DIR}) - set(DS_OPENSOURCE_DIR $ENV{DS_OPENSOURCE_DIR}) - else() - string(SHA256 _TEMP_PATH ${CMAKE_BINARY_DIR}) - set(DS_OPENSOURCE_DIR "/tmp/${_TEMP_PATH}") - endif() -endif() -get_filename_component(DS_OPENSOURCE_DIR ${DS_OPENSOURCE_DIR} ABSOLUTE) - -if (NOT BUILD_THREAD_NUM) - set(BUILD_THREAD_NUM 8) -endif() - -message(STATUS "Cache the third party libs to ${DS_OPENSOURCE_DIR}, " - "build them with ${BUILD_THREAD_NUM} parallelism.") - -find_program(Patch_EXECUTABLE patch) -set(Patch_FOUND ${Patch_EXECUTABLE}) -find_program(Meson_EXECUTABLE meson) -set(Meson_FOUND ${Meson_EXECUTABLE}) -find_program(Ninja_EXECUTABLE ninja) -set(Ninja_FOUND ${Ninja_EXECUTABLE}) - -function(__EXEC_COMMAND) - set(options) - set(one_value_args WORKING_DIRECTORY) - set(multi_value_args COMMAND) - cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) - - execute_process(COMMAND ${ARG_COMMAND} - WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} - RESULT_VARIABLE _RET) - if(NOT _RET EQUAL "0") - message(FATAL_ERROR "Fail execute command: ${ARG_COMMAND}, error: ${_RET}") - endif() -endfunction() - -function(DOWNLOAD_LIB_PKG LIB_NAME URL SHA256) - # OpenEuler tiny package url end with "rpm" suffix, we need - # to uncompress it and get the real source code package. - if (URL MATCHES ".*\.src\.rpm$") - FetchContent_Declare( - "${LIB_NAME}_rpm" - URL ${URL} - URL_HASH SHA256=${SHA256} - ) - FetchContent_GetProperties("${LIB_NAME}_rpm") - FetchContent_Populate("${LIB_NAME}_rpm") - - # TODO: need to consider the end suffix with zip, tar and so on. - file(GLOB _URL_LIST "${${LIB_NAME}_rpm_SOURCE_DIR}/${LIB_NAME}*\.tar\.gz" "${${LIB_NAME}_rpm_SOURCE_DIR}/${LIB_NAME}*\.tar\.xz") - if (NOT _URL_LIST) - message(FATAL_ERROR "Failed to find source package from ${${LIB_NAME}_rpm_SOURCE_DIR}") - endif() - list(GET _URL_LIST 0 URL) - list(LENGTH _URL_LIST _URL_LIST_LEN) - if (_URL_LIST_LEN GREATER 1) - message(WARNING "Get source package is more than 1, but we only choose the first one: ${URL}") - endif() - - file(SHA256 "${URL}" SHA256) - endif() - - FetchContent_Declare( - ${LIB_NAME} - URL ${URL} - URL_HASH SHA256=${SHA256} - ) - FetchContent_GetProperties(${LIB_NAME}) - message(STATUS "Download ${LIB_NAME} from ${URL}") - if(NOT ${LIB_NAME}_POPULATED) - FetchContent_Populate(${LIB_NAME}) - set(${LIB_NAME}_SOURCE_DIR ${${LIB_NAME}_SOURCE_DIR} PARENT_SCOPE) - set(${LIB_NAME}_BINARY_DIR ${${LIB_NAME}_BINARY_DIR} PARENT_SCOPE) - endif() -endfunction() - -# Generate fake third party tar package, it is all about trustworthiness. -# -# Arguments: -# NAME -# Specify the package name of the third-party library. -# -# URL -# Specify an output variable, path of the tar package is assigned to this variable. -# -# SHA256 -# Specify an output variable, SHA256 sum code of the tar package is assigned to this variable. -# -# FAKE_SHA256 -# A fake sha256, useful when building third party components from source code. -# -# VERSION -# Specify an output variable, the version of the package is assigned to this variable if version.txt exists. -# The version.txt is provided by the user/CI to specify the source code's version. -# The version.txt contains the version of package that must be equal to the version value provided by ConfigVersion.cmake, -# otherwise cmake find_package may fail -# The location of version.txt is ${DS_PACKAGE}/${PACKAGFE_NAME}/version.txt, like /usr1/third_party/zlib/version.txt -function(GEN_THIRDPARTY_PKG NAME URL SHA256 FAKE_SHA256 VERSION) - get_filename_component(_THIRDPARTY_DIR "$ENV{DS_PACKAGE}" ABSOLUTE) - set(_DIR "${_THIRDPARTY_DIR}/${NAME}") - - set(VERSION_TXT ${_DIR}/version.txt) - if (EXISTS ${VERSION_TXT}) - file(READ ${VERSION_TXT} _VERSION) - string(STRIP ${_VERSION} _VERSION) - endif() - - if ("${_VERSION}" STREQUAL "") - MESSAGE("The ${NAME} directory don't contain version.txt or it's empty") - else() - MESSAGE("Found thirdparty library ${NAME} version is ${_VERSION} in version.txt") - endif() - if (NOT EXISTS "${_DIR}" OR NOT IS_DIRECTORY "${_DIR}") - message(FATAL_ERROR "Specify path: ${_DIR} not exist or is not a directory!") - endif() - - set(_SUFFIX_LIST ".tar.gz" ".tar.xz" ".tar.bz2" ".zip") - if (${NAME} STREQUAL "re2" OR ${NAME} STREQUAL "absl") - list(TRANSFORM _SUFFIX_LIST PREPEND ${_DIR}/* OUTPUT_VARIABLE _DIR_SUFFIX_LIST) - else() - list(TRANSFORM _SUFFIX_LIST PREPEND ${_DIR}/${NAME}* OUTPUT_VARIABLE _DIR_SUFFIX_LIST) - endif() - file(GLOB _TAR_PKG_FILE ${_DIR_SUFFIX_LIST}) - - if (_TAR_PKG_FILE) - # OpenEuler would save the tar file in it's directory, unthinkable operation. - list(GET _TAR_PKG_FILE 0 _DEST_PATH) - list(LENGTH _TAR_PKG_FILE _TAR_PKG_LEN) - if (_TAR_PKG_LEN GREATER 1) - message(WARNING "Get tar file is more than 1, but we only choose the first one: ${_DEST_PATH}") - endif() - file(SHA256 "${_DEST_PATH}" _SHA256) - else() - # Step1: Generate sha256 based on source code. - execute_process(COMMAND sh -c "find ${_DIR} -path ${_DIR}/.git -prune -o -type f -print0 | sort -z | xargs -0 cat | sha256sum" - OUTPUT_VARIABLE _FINAL_SHA256_VALUE - RESULT_VARIABLE _RET) - if(NOT _RET EQUAL "0") - message(FATAL_ERROR "Fail to find files in source code, error: ${_RET}") - endif() - string(REGEX REPLACE "\ .*$" "" _FINAL_SHA256_VALUE "${_FINAL_SHA256_VALUE}") - # Step2: Generate fake *tar.gz - find_program(_TAR_EXECUTABLE tar) - if (NOT _TAR_EXECUTABLE) - message(FATAL_ERROR "tar command not found!") - endif() - - set(_DEST_PATH "${CMAKE_CURRENT_BINARY_DIR}/${NAME}.tar.gz") - if (EXISTS "${_DEST_PATH}") - file(REMOVE "${_DEST_PATH}") - endif() - __exec_command(COMMAND ${_TAR_EXECUTABLE} -zmcf "${_DEST_PATH}" -C "${_THIRDPARTY_DIR}" "${NAME}" - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - file(SHA256 "${_DEST_PATH}" _SHA256) - endif() - - # Set output variables. - set(${URL} "${_DEST_PATH}" PARENT_SCOPE) - set(${SHA256} "${_SHA256}" PARENT_SCOPE) - set(${FAKE_SHA256} "${_FINAL_SHA256_VALUE}" PARENT_SCOPE) - if (NOT "${_VERSION}" STREQUAL "") - set(${VERSION} "${_VERSION}" PARENT_SCOPE) - endif() -endfunction() - -# Add a third-party dependency library on which the Datasystem Depends. -# -# LIB_NAME is the name of the library. -# -# Additional optional arguments: -# -# URL -# Specify download url, it can be a link or file path. -# -# SHA256 -# Specify package provided by URL sha256 sum for check purpose. -# -# FAKE_SHA256 -# A fake sha256, useful when building third party components from source code. -# -# VERSION -# Specify library version. -# -# TOOLCHAIN -# Specify compile toolchain, support cmake, configure and so on. -# -# CONF_PATH -# Specify configure file path, it can be useful if the configure -# file is not in root dir. -# -# COMPONENTS ... -# Specify the components we need from third-party library, if we -# don't need all components, we can just specify the components -# what we need by this argument. -# -# CONF_OPTIONS ... -# Specify the configure options, the value depends on which -# toolchain we use. -# -# PRE_CONFIGURE ... -# Specify the pre-configure command before execute the configure, -# e.g. sh autogen.sh . -# -# PATHCES ... -# Specify the patch files path, they would be apply before compile. -# -# CXX_FLAGS ... -# Specify the CXX compile flags. -# -# C_FLAGS ... -# Specify the C compile flags. -# -# LINK_FLAGS ... -# Specify the link flags. -# -# EXTRA_MSGS ... -# Specify the extra messages, it is helpful when third-party lib also -# have dependent libraries. If dependent libraries changed, the lib -# would be force to update. -function(ADD_THIRDPARTY_LIB LIB_NAME) - set(options) - set(one_value_args URL SHA256 FAKE_SHA256 VERSION TOOLCHAIN CONF_PATH) - set(multi_value_args COMPONENTS CONF_OPTIONS PRE_CONFIGURE PATCHES CXX_FLAGS C_FLAGS LINK_FLAGS EXTRA_MSGS) - cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) - - string(TOLOWER ${LIB_NAME} _LIB_NAME_LOWER) - - if(NOT ARG_TOOLCHAIN) - set(ARG_TOOLCHAIN "cmake") - endif() - - # Generate a unique install dir name, the impact factors are as follow: - # Lib name: - set(${LIB_NAME}_CONF_TXT "${_LIB_NAME_LOWER}") - if(NOT ${ARG_FAKE_SHA256} STREQUAL "") - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}_${ARG_FAKE_SHA256}") - else() - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}_${ARG_SHA256}") - endif() - # Version: - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}_${ARG_VERSION}") - # Components: - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}_${ARG_COMPONENTS}") - # Toolchain: - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}_${ARG_TOOLCHAIN}") - # Configure options: - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}_${ARG_CONF_OPTIONS}") - # CXX compiler version: - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}_${CMAKE_CXX_COMPILER_VERSION}") - # C compiler version: - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}_${CMAKE_C_COMPILER_VERSION}") - # CXX_FLAGS: - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}_${ARG_CXX_FLAGS}") - # C_FLAGS: - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}_${ARG_C_FLAGS}") - # LINK_FLAGS: - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}_${ARG_LINK_FLAGS}") - # Patch files: - foreach(_PATCH ${ARG_PATCHES}) - file(SHA256 ${_PATCH} _PATCH_SHA256) - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}}_${_PATCH_SHA256}") - endforeach() - # Extra messages: - foreach(_MSG ${ARG_EXTRA_MSGS}) - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}}_${_MSG}") - endforeach() - string(REPLACE ";" "_" ${LIB_NAME}_CONF_TXT ${${LIB_NAME}_CONF_TXT}) - string(SHA256 _ROOT_SUFFIX ${${LIB_NAME}_CONF_TXT}) - set(${LIB_NAME}_ROOT "${DS_OPENSOURCE_DIR}/${_LIB_NAME_LOWER}_${_ROOT_SUFFIX}") - - # Check if we have cache the lib, if true, reuse it directly. - set(_VERIFY_FILE "${${LIB_NAME}_ROOT}/${LIB_NAME}_install.txt") - if(EXISTS ${${LIB_NAME}_ROOT}) - if (EXISTS ${_VERIFY_FILE}) - set(${LIB_NAME}_FOUND TRUE) - endif() - - if(${LIB_NAME}_FOUND) - message(STATUS "${LIB_NAME} found in ${${LIB_NAME}_ROOT}...") - if (EXISTS ${${LIB_NAME}_ROOT}/lib64) - set(${LIB_NAME}_LIB_PATH ${${LIB_NAME}_ROOT}/lib64) - else() - set(${LIB_NAME}_LIB_PATH ${${LIB_NAME}_ROOT}/lib) - endif() - set(${LIB_NAME}_LIB_PATH ${${LIB_NAME}_LIB_PATH} PARENT_SCOPE) - set(${LIB_NAME}_ROOT "${${LIB_NAME}_ROOT}" PARENT_SCOPE) - if (DEFINED EXPORT_TO_USER_ENV_FILE) - file(APPEND "${EXPORT_TO_USER_ENV_FILE}" - "set(${LIB_NAME}_ROOT ${${LIB_NAME}_ROOT})" "\n" - "set(${LIB_NAME}_LIB_PATH ${${LIB_NAME}_LIB_PATH})" "\n" - ) - endif() - return() - else() - message(STATUS "${LIB_NAME} not found in ${${LIB_NAME}_ROOT}, need recompile...") - # Well, although the cache directory exists, it appears to be corrupted (because we can't find - # it via find_package). So remove the directory directly and we will recompile the lib. - file(REMOVE_RECURSE "${${LIB_NAME}_ROOT}") - endif() - endif() - - # Fetch the package first. - download_lib_pkg(${_LIB_NAME_LOWER} ${ARG_URL} ${ARG_SHA256}) - - # Apply the patches if need. - foreach(_PATCH ${ARG_PATCHES}) - if (NOT Patch_FOUND) - message(FATAL_ERROR "patch executable not found!") - endif() - execute_process(COMMAND ${Patch_EXECUTABLE} --verbose -p1 INPUT_FILE ${_PATCH} - WORKING_DIRECTORY ${${_LIB_NAME_LOWER}_SOURCE_DIR} - RESULT_VARIABLE _RET) - if(NOT _RET EQUAL "0") - message("Patch ${_PATCH} failed, error: ${_RET}") - endif() - endforeach() - - # Compile the source code and install. - message(STATUS "Compiling ${LIB_NAME} in ${${_LIB_NAME_LOWER}_BINARY_DIR}") - string(TOLOWER ${ARG_TOOLCHAIN} _TOOLCHAIN_LOWER) - - if(${_LIB_NAME_LOWER} STREQUAL "tbb" AND ${_TOOLCHAIN_LOWER} STREQUAL "make") - find_program(MAKE_PROGRAM make) # CMAKE_MAKE_PROGRAM may not be make. - if (NOT MAKE_PROGRAM) - message(FATAL_ERROR "make program not found! Please install make.") - endif() - if (ARG_CXX_FLAGS) - list(APPEND ${LIB_NAME}_MAKE_CXXFLAGS "CXXFLAGS=${ARG_CXX_FLAGS}") - endif() - if (ARG_C_FLAGS) - list(APPEND ${LIB_NAME}_MAKE_CFLAGS "CFLAGS=${ARG_C_FLAGS}") - endif() - if (ARG_LINK_FLAGS) - list(APPEND ${LIB_NAME}_MAKE_LDFLAGS "LDFLAGS=${ARG_LINK_FLAGS}") - endif() - __exec_command(COMMAND ${MAKE_PROGRAM} - ${${LIB_NAME}_MAKE_CFLAGS} - ${${LIB_NAME}_MAKE_CXXFLAGS} - ${${LIB_NAME}_MAKE_LDFLAGS} - -j ${BUILD_THREAD_NUM} - WORKING_DIRECTORY ${${_LIB_NAME_LOWER}_SOURCE_DIR}) - # Copy headers - file(COPY ${${_LIB_NAME_LOWER}_SOURCE_DIR}/include/tbb - DESTINATION ${${LIB_NAME}_ROOT}/include) - # Copy libs - file(GLOB_RECURSE _LIBS_LIST "${${_LIB_NAME_LOWER}_SOURCE_DIR}/*lib*.so*") - foreach(_LIB ${_LIBS_LIST}) - file(COPY "${_LIB}" DESTINATION ${${LIB_NAME}_ROOT}/lib) - endforeach() - elseif(${_LIB_NAME_LOWER} STREQUAL "ub") - # libub could not install directly, copy its header files and libs by ourselves. - if (NOT EXISTS ${${LIB_NAME}_ROOT}) - file(MAKE_DIRECTORY ${${LIB_NAME}_ROOT}) - endif() - # extract files from rpm - file(GLOB RPM_FILES "${${_LIB_NAME_LOWER}_SOURCE_DIR}/umdk-*.rpm") - foreach(file ${RPM_FILES}) - execute_process(COMMAND rpm2cpio ${file} - COMMAND cpio -idmv - WORKING_DIRECTORY ${${_LIB_NAME_LOWER}_SOURCE_DIR} - OUTPUT_QUIET - RESULT_VARIABLE _RET) - if(NOT _RET EQUAL "0") - message(FATAL_ERROR "Fail to extract files from rpm, error: ${_RET}") - endif() - endforeach() - # Copy headers - file(COPY ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/include/umdk/flowbuf/cpp/flowbuffer.h - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/include/umdk/common/ub_util.h - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/include/umdk/urma_opcode.h - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/include/umdk/urma_types.h - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/include/umdk/urma_api.h - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/include/umdk/urpc/cpp - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/include/umdk/urpc/urpc.h - DESTINATION ${${LIB_NAME}_ROOT}/include) - # Copy libs - file(COPY ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/libflowbuffer.so - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/liburma.so - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/liburma.so.0 - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/liburma.so.0.0.1 - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/liburma_common.so - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/liburma_common.so.0 - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/liburma_common.so.0.0.1 - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/liburpc.so - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/liburpc_cpp.so - DESTINATION ${${LIB_NAME}_ROOT}/lib64) - # copy only ib libs to /urma - file(COPY ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/urma/liburma_ib.so - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/urma/liburma_ib.so.0 - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/urma/liburma_ib.so.0.0.1 - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/urma/liburma_ip.so - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/urma/liburma_ip.so.0 - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/lib64/urma/liburma_ip.so.0.0.1 - DESTINATION ${${LIB_NAME}_ROOT}/lib64/urma) - - # Copy bins - file(COPY ${${_LIB_NAME_LOWER}_SOURCE_DIR}/usr/bin/flowc - DESTINATION ${${LIB_NAME}_ROOT}/bin) - elseif(${_TOOLCHAIN_LOWER} STREQUAL "cmake") - if (ARG_CXX_FLAGS) - list(APPEND ARG_CONF_OPTIONS "-DCMAKE_CXX_FLAGS=${ARG_CXX_FLAGS}") - endif() - if (ARG_C_FLAGS) - list(APPEND ARG_CONF_OPTIONS "-DCMAKE_C_FLAGS=${ARG_C_FLAGS}") - endif() - if (ARG_LINK_FLAGS) - list(APPEND ARG_CONF_OPTIONS "-DCMAKE_SHARED_LINKER_FLAGS=${ARG_LINK_FLAGS}") - endif() - list(APPEND ARG_CONF_OPTIONS "-DCMAKE_INSTALL_PREFIX=${${LIB_NAME}_ROOT}") - - __exec_command(COMMAND ${CMAKE_COMMAND} -G ${CMAKE_GENERATOR} - ${ARG_CONF_OPTIONS} - ${${_LIB_NAME_LOWER}_SOURCE_DIR}/${ARG_CONF_PATH} - WORKING_DIRECTORY ${${_LIB_NAME_LOWER}_BINARY_DIR}) - - __exec_command(COMMAND ${CMAKE_COMMAND} --build . --target install -- -j${BUILD_THREAD_NUM} - WORKING_DIRECTORY ${${_LIB_NAME_LOWER}_BINARY_DIR}) - - elseif(${_TOOLCHAIN_LOWER} STREQUAL "configure") - # If we need to do something before run ./configure, just do it. - if (ARG_PRE_CONFIGURE) - __exec_command(COMMAND ${ARG_PRE_CONFIGURE} - WORKING_DIRECTORY ${${_LIB_NAME_LOWER}_SOURCE_DIR}) - endif() - - # Add compile flags, install prefix and run configure. - if (ARG_CXX_FLAGS) - list(APPEND ARG_CONF_OPTIONS "CXXFLAGS=${ARG_CXX_FLAGS}") - endif() - if (ARG_C_FLAGS) - list(APPEND ARG_CONF_OPTIONS "CFLAGS=${ARG_C_FLAGS}") - endif() - if (ARG_LINK_FLAGS) - list(APPEND ARG_CONF_OPTIONS "LDFLAGS=${ARG_LINK_FLAGS}") - endif() - list(APPEND ARG_CONF_OPTIONS "--prefix=${${LIB_NAME}_ROOT}") - - if (EXISTS ${${_LIB_NAME_LOWER}_SOURCE_DIR}/config) - set(_CONFIG_FILE ${${_LIB_NAME_LOWER}_SOURCE_DIR}/config) - else() - set(_CONFIG_FILE ${${_LIB_NAME_LOWER}_SOURCE_DIR}/configure) - endif() - - __exec_command(COMMAND sh ${_CONFIG_FILE} ${ARG_CONF_OPTIONS} - WORKING_DIRECTORY ${${_LIB_NAME_LOWER}_SOURCE_DIR}) - - # make -j && make install - if (NOT CMAKE_MAKE_PROGRAM) - message(FATAL_ERROR "make program not found!") - endif() - __exec_command(COMMAND ${CMAKE_MAKE_PROGRAM} - ${${LIB_NAME}_MAKE_CFLAGS} - ${${LIB_NAME}_MAKE_CXXFLAGS} - ${${LIB_NAME}_MAKE_LDFLAGS} - -j ${BUILD_THREAD_NUM} - WORKING_DIRECTORY ${${_LIB_NAME_LOWER}_SOURCE_DIR}) - __exec_command(COMMAND ${CMAKE_MAKE_PROGRAM} install - WORKING_DIRECTORY ${${_LIB_NAME_LOWER}_SOURCE_DIR}) - else() - message(FATAL_ERROR "Unrecognized toolchain: ${ARG_TOOLCHAIN}") - endif() - - # Write install text to root dir for verify purpose. - file(WRITE "${_VERIFY_FILE}" "${${LIB_NAME}_CONF_TXT}") - - # For output package variables. - if (EXISTS ${${LIB_NAME}_ROOT}/lib64) - set(${LIB_NAME}_LIB_PATH ${${LIB_NAME}_ROOT}/lib64) - else() - set(${LIB_NAME}_LIB_PATH ${${LIB_NAME}_ROOT}/lib) - endif() - set(${LIB_NAME}_LIB_PATH ${${LIB_NAME}_LIB_PATH} PARENT_SCOPE) - set(${LIB_NAME}_ROOT ${${LIB_NAME}_ROOT} PARENT_SCOPE) - - if (DEFINED EXPORT_TO_USER_ENV_FILE) - file(APPEND "${EXPORT_TO_USER_ENV_FILE}" - "set(${LIB_NAME}_ROOT ${${LIB_NAME}_ROOT})" "\n" - "set(${LIB_NAME}_LIB_PATH ${${LIB_NAME}_LIB_PATH})" "\n" - ) - endif() -endfunction() - -# Adjuice third-party dependency library version. -# -# LIB_NAME is the name of the library. -# -# Output variables: -# ${LIB_NAME}_VERSION -# third-party library version. -# -# ${LIB_NAME}_URL -# third-party library download url. -# -# ${LIB_NAME}_SHA256 -# third-party library SHA256 for verify. -function(ADJUICE_THIRDPARTY_VERSION LIB_NAME) - if ("$ENV{DS_PACKAGE}" STREQUAL "") - if (${LIB_NAME}_VERSION) - list(FIND ${LIB_NAME}_VERSIONS "${${LIB_NAME}_VERSION}" ${LIB_NAME}_INDEX) - if (${LIB_NAME}_INDEX EQUAL -1) - message(FATAL_ERROR "Unsupported protobuf version: ${${LIB_NAME}_VERSION}, available versions are: ${${LIB_NAME}_VERSIONS}") - endif() - else() - set(${LIB_NAME}_INDEX 0) - endif() - list(GET ${LIB_NAME}_VERSIONS ${${LIB_NAME}_INDEX} ${LIB_NAME}_VERSION) - list(GET ${LIB_NAME}_URLS ${${LIB_NAME}_INDEX} ${LIB_NAME}_URL) - list(GET ${LIB_NAME}_SHA256S ${${LIB_NAME}_INDEX} ${LIB_NAME}_SHA256) - else() - gen_thirdparty_pkg(${LIB_NAME} ${LIB_NAME}_URL ${LIB_NAME}_SHA256 ${LIB_NAME}_FAKE_SHA256 ${LIB_NAME}_VERSION) - endif() - set(${LIB_NAME}_VERSION ${${LIB_NAME}_VERSION} PARENT_SCOPE) - set(${LIB_NAME}_URL ${${LIB_NAME}_URL} PARENT_SCOPE) - set(${LIB_NAME}_SHA256 ${${LIB_NAME}_SHA256} PARENT_SCOPE) - set(${LIB_NAME}_FAKE_SHA256 ${${LIB_NAME}_FAKE_SHA256} PARENT_SCOPE) -endfunction() - -function(INSTALL_DATASYSTEM_TARGET TARGET) - set(options) - set(one_value_args EXPORT_NAME) - set(multi_value_args) - cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) - if (NOT ${TARGET}_INSTALL_LIBPATH) - set(${TARGET}_INSTALL_LIBPATH lib) - endif() - - if (NOT ${TARGET}_INSTALL_BINPATH) - set(${TARGET}_INSTALL_BINPATH bin) - endif() - - if (ARG_EXPORT_NAME) - install(TARGETS ${TARGET} - EXPORT ${ARG_EXPORT_NAME} - ARCHIVE DESTINATION ${${TARGET}_INSTALL_LIBPATH} - LIBRARY DESTINATION ${${TARGET}_INSTALL_LIBPATH} - RUNTIME DESTINATION ${${TARGET}_INSTALL_BINPATH}) - else() - install(TARGETS ${TARGET} - ARCHIVE DESTINATION ${${TARGET}_INSTALL_LIBPATH} - LIBRARY DESTINATION ${${TARGET}_INSTALL_LIBPATH} - RUNTIME DESTINATION ${${TARGET}_INSTALL_BINPATH}) - endif() -endfunction() - -# for git information -macro(get_git_branch git_branch_out_var) - find_package(Git QUIET) - if (GIT_FOUND) - execute_process( - COMMAND ${GIT_EXECUTABLE} symbolic-ref --short -q HEAD - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ERROR_QUIET - OUTPUT_VARIABLE ${git_branch_out_var} - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - endif () -endmacro() - -macro(get_git_hash git_hash_out_var) - find_package(Git QUIET) - if (GIT_FOUND) - execute_process( - COMMAND ${GIT_EXECUTABLE} log -1 "--pretty=format:[%H] [%ai]" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ERROR_QUIET - OUTPUT_VARIABLE ${git_hash_out_var} - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - endif () -endmacro() - -# Add datasystem GoogleTest to CTest. -# -# TARGET is the llt test executable. -# -# Additional optional arguments: -# -# WORKING_DIR -# Specify the working directory when running test executable. -# -# TEST_ENVIRONMENTS ... -# Specify the test environments variables when running test executable. -function(ADD_DATASYSTEM_TEST TARGET) - set(options) - set(one_value_args WORKING_DIR) - set(multi_value_args TEST_ENVIRONMENTS) - cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) - - if (NOT ARG_WORKING_DIR) - set(ARG_WORKING_DIR ${CMAKE_CURRENT_BINARY_DIR}) - endif() - - if (ARG_TEST_ENVIRONMENTS) - string(REGEX REPLACE ";" " " ARG_TEST_ENVIRONMENTS "${ARG_TEST_ENVIRONMENTS}") - else() - set(ARG_TEST_ENVIRONMENTS "") - endif() - - set(_CTEST_INCLUDE_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_include.cmake") - set(_CTEST_TEST_FILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_tests.cmake") - set(_CTEST_GEN_SCRIPT "${CMAKE_SOURCE_DIR}/cmake/scripts/GoogleTestToCTest.cmake") - - add_custom_command( - TARGET ${TARGET} POST_BUILD - BYPRODUCTS "${_CTEST_TEST_FILE}" - COMMAND "${CMAKE_COMMAND}" - -D "TEST_TARGET=${TARGET}" - -D "TEST_EXECUTABLE=$" - -D "TEST_WORKING_DIR=${ARG_TEST_ENVIRONMENTS}" - -D "TEST_ENVIRONMENTS=${ARG_TEST_ENVIRONMENTS}" - -D "CTEST_FILE=${_CTEST_TEST_FILE}" - -P "${_CTEST_GEN_SCRIPT}" - VERBATIM - ) - - file(WRITE "${_CTEST_INCLUDE_FILE}" - "if(NOT EXISTS \"${_CTEST_TEST_FILE}\")\n" - " message(FATAL_ERROR \"${_CTEST_TEST_FILE} not found!\")\n" - "else()\n" - " include(\"${_CTEST_TEST_FILE}\")\n" - "endif()\n") - - # Add discovered tests to directory TEST_INCLUDE_FILES - set_property(DIRECTORY APPEND PROPERTY TEST_INCLUDE_FILES "${_CTEST_INCLUDE_FILE}") -endfunction() - -# Clean target build rpath. Some targets like python shared library -# would package as jar/wheel format file first then install. But there -# build rpath need to erase first. -# -# TARGET is CMake target, shared library or executable is available. -function(CLEAN_BUILD_RPATH TARGET) - if (NOT TARGET) - message(FATAL_ERROR "TARGET not specified!") - endif() - - set(_BUILD_RPATH_REMOVE_SCRIPT "${CMAKE_SOURCE_DIR}/cmake/scripts/CleanBuildRpath.cmake") - - add_custom_command( - TARGET ${TARGET} POST_BUILD - COMMAND "${CMAKE_COMMAND}" - -D "BIN_FILE=$" - -P "${_BUILD_RPATH_REMOVE_SCRIPT}" - VERBATIM - ) -endfunction() - -# Run StripAndGenHash.cmake to strip libraries in install stage. -# -# LIB_LIST -# Specify the list of library path waiting to strip. -# DST_DIR -# Specify the destination directory path of StripAndGenHash run. -function(STRIP_LIBS_IN_INSTALL_STAGE LIB_LIST DST_DIR) - set(STRIP_GEN_HASH_SCRIPT ${CMAKE_SOURCE_DIR}/cmake/scripts/StripAndGenHash.cmake) - foreach(_LIB ${${LIB_LIST}}) - # Use install code to pass variables to cmake script - # Packaging python don't need to generate so.properties, set IGNORE_SO_PROPERTY to TRUE - install( - CODE " - set(SRC_PATH_PATTERN \"${_LIB}\") - set(DST_PATH \"${${DST_DIR}}\") - set(STRIP_LIB \"${ENABLE_STRIP}\") - set(IGNORE_SO_PROPERTY TRUE) - ") - install(SCRIPT ${STRIP_GEN_HASH_SCRIPT}) - endforeach() -endfunction() - -# Package python whl file -# -# PACKAGE_NAME is the package name of python library -# -# Additional optional arguments: -# -# CMAKE_INSTALL_PATH -# Specify the directory path where python whl file save. -# -# DEPEND_TARGETS ... -# Specify the datasystem targets which python library depend. -# -# THIRDPARTY_LIBS_PATTERN ... -# Specify the third party library file path which python library depend, support match pattern. -# Both soname and filename path is needed. -function(PACKAGE_DATASYSTEM_WHEEL PACKAGE_NAME) - set(options) - set(one_value_args CMAKE_INSTALL_PATH) - set(multi_value_args DEPEND_TARGETS THIRDPATRY_LIBS_PATTERN) - cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) - - # Store all temporary package files, will be deleted after package finish. - set(DATASYSTEM_WHEEL_PATH ${CMAKE_BINARY_DIR}/dist/datasystem) - set(DATASYSTEM_SETUP_PATH ${CMAKE_BINARY_DIR}/dist) - set(DATASYSTEM_PACKAGE_LIBPATH ${CMAKE_SOURCE_DIR}) - - # Store helm chart - set(HELM_CHART_PATH ${CMAKE_SOURCE_DIR}/k8s/helm_chart) - set(SERVER_LIB ${CMAKE_INSTALL_PREFIX}/service/lib) - set(OUTPUT_INCLUDE_DIF ${CMAKE_INSTALL_PREFIX}/sdk/cpp/include) - set(SDK_LIB ${CMAKE_INSTALL_PREFIX}/sdk/cpp/lib) - set(PYTHON_SDK ${CMAKE_SOURCE_DIR}/python) - set(PYTHON_LIBPATH ${CMAKE_BINARY_DIR}/python_lib) - - FILE(GLOB_RECURSE THIRDPARTY_LIBS_PATH "${PYTHON_LIBPATH}/*.so*") - LIST(FILTER THIRDPARTY_LIBS_PATH EXCLUDE REGEX ".*sym.*") - - foreach(_PATTERN ${ARG_THIRDPATRY_LIBS_PATTERN}) - file(GLOB_RECURSE THIRDPARTY_LIB_LIST ${_PATTERN}) - foreach(_THIRDPARTY_LIB ${THIRDPARTY_LIB_LIST}) - install(FILES ${_THIRDPARTY_LIB} DESTINATION ${PYTHON_LIBPATH}) - if (NOT IS_SYMLINK ${_THIRDPARTY_LIB}) - get_filename_component(_LIB_NAME ${_THIRDPARTY_LIB} NAME) - list(APPEND NEED_STRIP_LIBS ${PYTHON_LIBPATH}/${_LIB_NAME}) - endif() - endforeach() - endforeach() - - # Install datasystem target we need. - foreach(_TARGET ${ARG_DEPEND_TARGETS}) - set(${_TARGET}_INSTALL_LIBPATH ${PYTHON_LIBPATH}) - install_datasystem_target(${_TARGET}) - list(APPEND NEED_STRIP_LIBS ${PYTHON_LIBPATH}/$) - endforeach() - - # Strip libraries in PYTON_LIBPATH - list(TRANSFORM ARG_NEED_STRIP_LIBS PREPEND "${PYTHON_LIBPATH}/") - strip_libs_in_install_stage(NEED_STRIP_LIBS PYTHON_LIBPATH) - - # Copy chart files to package lib path - install(DIRECTORY ${HELM_CHART_PATH}/ - DESTINATION ${DATASYSTEM_WHEEL_PATH}/helm_chart) - - # Copy cpp include files to package lib path - install(DIRECTORY ${CMAKE_SOURCE_DIR}/include - DESTINATION ${DATASYSTEM_WHEEL_PATH}/) - - # Copy service lib to package lib path - install(DIRECTORY ${SERVER_LIB}/ - DESTINATION ${DATASYSTEM_WHEEL_PATH}/lib/) - - # Copy sdk lib - install(DIRECTORY ${SDK_LIB}/ - DESTINATION ${DATASYSTEM_WHEEL_PATH}/lib/ - PATTERN "cmake" EXCLUDE) - - # Copy python sdk - install(DIRECTORY ${PYTHON_SDK}/ - DESTINATION ${DATASYSTEM_WHEEL_PATH}/) - - # Copy ds cli source files to package lib path - install(DIRECTORY ${CMAKE_SOURCE_DIR}/cli - DESTINATION ${DATASYSTEM_WHEEL_PATH}) - - #Copy setup.py - install(FILES ${CMAKE_SOURCE_DIR}/setup.py DESTINATION ${DATASYSTEM_SETUP_PATH}) - - # Copy VERSION and LICENSE to package lib path - install(FILES ${CMAKE_SOURCE_DIR}/VERSION ${CMAKE_SOURCE_DIR}/LICENSE ${CMAKE_SOURCE_DIR}/README.md - DESTINATION ${DATASYSTEM_WHEEL_PATH}) - # Copy cpp template to package lib path - install(DIRECTORY ${CMAKE_SOURCE_DIR}/example/cpp_template - DESTINATION ${DATASYSTEM_WHEEL_PATH}) - # Copy worker and worker_config to package lib path - install(FILES ${CMAKE_INSTALL_PREFIX}/service/datasystem_worker ${CMAKE_SOURCE_DIR}/cli/deploy/conf/worker_config.json ${CMAKE_SOURCE_DIR}/cli/deploy/conf/cluster_config.json - DESTINATION ${DATASYSTEM_WHEEL_PATH}) - - find_package(Python3 COMPONENTS Interpreter Development) - set(CONFIG_PACKAGE_SCRIPT ${CMAKE_BINARY_DIR}/PackageDatasystem.cmake) - # Generate PackagePythonSDK.cmake to run setup.py - configure_file(${CMAKE_SOURCE_DIR}/cmake/scripts/PackageDatasystem.cmake.in - ${CONFIG_PACKAGE_SCRIPT} @ONLY) - install(SCRIPT ${CONFIG_PACKAGE_SCRIPT}) -endfunction() - -function(PACKAGE_PYTHON PACKAGE_NAME) - set(options) - set(one_value_args PYTHON_SRC_DIR CMAKE_INSTALL_PATH) - set(multi_value_args DEPEND_TARGETS THIRDPATRY_LIBS_PATTERN) - cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) - - # Store all temporary package files, will be deleted after package finish. - set(PYTHON_PACKAGE_PATH ${CMAKE_BINARY_DIR}/python_api) - # Store python source files and libraries. - set(PYTHON_PACKAGE_LIBPATH ${PYTHON_PACKAGE_PATH}/${PACKAGE_NAME}) - # Store installed libraries, also store sym files if ENABLE_STRIP. - set(PYTHON_LIBPATH ${CMAKE_BINARY_DIR}/python_lib) - - FILE(GLOB_RECURSE THIRDPARTY_LIBS_PATH "${PYTHON_LIBPATH}/*.so*") - LIST(FILTER THIRDPARTY_LIBS_PATH EXCLUDE REGEX ".*sym.*") - - foreach(_PATTERN ${ARG_THIRDPATRY_LIBS_PATTERN}) - file(GLOB_RECURSE THIRDPARTY_LIB_LIST ${_PATTERN}) - foreach(_THIRDPARTY_LIB ${THIRDPARTY_LIB_LIST}) - install(FILES ${_THIRDPARTY_LIB} DESTINATION ${PYTHON_LIBPATH}) - if (NOT IS_SYMLINK ${_THIRDPARTY_LIB}) - get_filename_component(_LIB_NAME ${_THIRDPARTY_LIB} NAME) - list(APPEND NEED_STRIP_LIBS ${PYTHON_LIBPATH}/${_LIB_NAME}) - endif() - endforeach() - endforeach() - - # Install datasystem target we need. - foreach(_TARGET ${ARG_DEPEND_TARGETS}) - set(${_TARGET}_INSTALL_LIBPATH ${PYTHON_LIBPATH}) - install_datasystem_target(${_TARGET}) - list(APPEND NEED_STRIP_LIBS ${PYTHON_LIBPATH}/$) - endforeach() - - # Strip libraries in PYTON_LIBPATH - list(TRANSFORM ARG_NEED_STRIP_LIBS PREPEND "${PYTHON_LIBPATH}/") - strip_libs_in_install_stage(NEED_STRIP_LIBS PYTHON_LIBPATH) - - # Copy python source files to package lib path - install(DIRECTORY ${ARG_PYTHON_SRC_DIR}/ - DESTINATION ${PYTHON_PACKAGE_LIBPATH}) - # Copy VERSION and LICENSE to package lib path - install(FILES ${CMAKE_SOURCE_DIR}/VERSION ${CMAKE_SOURCE_DIR}/LICENSE - DESTINATION ${PYTHON_PACKAGE_LIBPATH}) - set(CONFIG_PACKAGE_SCRIPT ${CMAKE_BINARY_DIR}/PackagePythonSDK.cmake) - # Generate PackagePythonSDK.cmake to run setup.py - configure_file(${CMAKE_SOURCE_DIR}/cmake/scripts/PackagePython.cmake.in - ${CONFIG_PACKAGE_SCRIPT} @ONLY) - install(SCRIPT ${CONFIG_PACKAGE_SCRIPT}) -endfunction() - -function(ADD_THIRDPARTY_SO LIB_NAME) - set(options) - set(one_value_args URL SHA256 VERSION TOOLCHAIN CONF_PATH) - set(multi_value_args COMPONENTS CONF_OPTIONS PRE_CONFIGURE PATCHES CXX_FLAGS C_FLAGS LINK_FLAGS EXTRA_MSGS) - cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) - - string(TOLOWER ${LIB_NAME} _LIB_NAME_LOWER) - - # Generate a unique install dir name, the impact factors are as follow: - # Lib name: - set(${LIB_NAME}_CONF_TXT "${_LIB_NAME_LOWER}") - # SHA256: - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}_${ARG_SHA256}") - # Version: - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}_${ARG_VERSION}") - # Components: - set(${LIB_NAME}_CONF_TXT "${${LIB_NAME}_CONF_TXT}_${ARG_COMPONENTS}") - - string(REPLACE ";" "_" ${LIB_NAME}_CONF_TXT ${${LIB_NAME}_CONF_TXT}) - string(SHA256 _ROOT_SUFFIX ${${LIB_NAME}_CONF_TXT}) - set(${LIB_NAME}_ROOT "${DS_OPENSOURCE_DIR}/${_LIB_NAME_LOWER}_${_ROOT_SUFFIX}") - - # Check if we have cache the lib, if true, reuse it directly. - set(_VERIFY_FILE "${${LIB_NAME}_ROOT}/${LIB_NAME}_install.txt") - if(EXISTS ${${LIB_NAME}_ROOT}) - if (EXISTS ${_VERIFY_FILE}) - set(${LIB_NAME}_FOUND TRUE) - endif() - - if(${LIB_NAME}_FOUND) - message(STATUS "${LIB_NAME} found in ${${LIB_NAME}_ROOT}...") - if (EXISTS ${${LIB_NAME}_ROOT}/lib64) - set(${LIB_NAME}_LIB_PATH ${${LIB_NAME}_ROOT}/lib64 PARENT_SCOPE) - else() - set(${LIB_NAME}_LIB_PATH ${${LIB_NAME}_ROOT}/lib PARENT_SCOPE) - endif() - set(${LIB_NAME}_ROOT "${${LIB_NAME}_ROOT}" PARENT_SCOPE) - return() - else() - message(STATUS "${LIB_NAME} not found in ${${LIB_NAME}_ROOT}, need recompile...") - # Well, although the cache directory exists, it appears to be corrupted (because we can't find - # it via find_package). So remove the directory directly and we will recompile the lib. - file(REMOVE_RECURSE "${${LIB_NAME}_ROOT}") - endif() - endif() - - # Fetch the package first. - download_lib_pkg(${_LIB_NAME_LOWER} ${ARG_URL} ${ARG_SHA256}) - - file(COPY ${${_LIB_NAME_LOWER}_SOURCE_DIR}/lib/release/libStsSdk.so DESTINATION ${${LIB_NAME}_ROOT}/lib) - file(COPY ${${_LIB_NAME_LOWER}_SOURCE_DIR}/include DESTINATION ${${LIB_NAME}_ROOT}) - - # Write install text to root dir for verify purpose. - file(WRITE "${_VERIFY_FILE}" "${${LIB_NAME}_CONF_TXT}") - - # For output package variables. - if (EXISTS ${${LIB_NAME}_ROOT}/lib64) - set(${LIB_NAME}_LIB_PATH ${${LIB_NAME}_ROOT}/lib64 PARENT_SCOPE) - else() - set(${LIB_NAME}_LIB_PATH ${${LIB_NAME}_ROOT}/lib PARENT_SCOPE) - endif() - - set(${LIB_NAME}_ROOT ${${LIB_NAME}_ROOT} PARENT_SCOPE) -endfunction() - -# Install file support pattern matching. -# Cmake's install(FILE) don't support pattern matching, and install(DIRECTORY) is hard to control details. -# So we add INSTALL_FILE_PATTERN to work like install(FILE) but support passing pattern. -# Make Sure the specific files can be found in configure stage. -# -# Additional optional arguments: -# -# DEST_DIR -# Specify the destination directory path of installing file. -# -# PATH_PATTERN ... -# Specify the library path pattern, like ${zlib_LIBRARY}/libz.so* . -# -# PERMISSIONS ... -# Specify permissions of copied file. -function(INSTALL_FILE_PATTERN) - set(options) - set(one_value_args DEST_DIR) - set(multi_value_args PATH_PATTERN PERMISSIONS) - cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) - - foreach(PATTERN ${ARG_PATH_PATTERN}) - file(GLOB_RECURSE PATH_LIST ${PATTERN}) - foreach(FILE_PATH ${PATH_LIST}) - if(ARG_PERMISSIONS) - install(FILES ${FILE_PATH} DESTINATION ${ARG_DEST_DIR} PERMISSIONS ${ARG_PERMISSIONS}) - else() - install(FILES ${FILE_PATH} DESTINATION ${ARG_DEST_DIR}) - endif() - endforeach() - endforeach() -endfunction() - -# Generate protobuf cc files. -# -# SRCS is the output variable of the protobuf source files. -# -# HDRS is the output variable of the protobuf header files. -# -# TARGET_DIR is the generate cc files target directory. -# -# Additional optional arguments: -# -# PROTO_FILES ... -# Protobuf source files to be compiled. -# -# SOURCE_ROOT -# Protobuf source files root directory, default is ${CMAKE_CURRENT_SOURCE_DIR}, -# if protobuf source files are not in ${CMAKE_SOURCE_DIR}, this variable must -# be set. -# -# PROTO_DEPEND -# If the generated cc files need to depend some target this variable must be set. -function(GENERATE_PROTO_CPP SRCS HDRS TARGET_DIR) - set(options) - set(one_value_args SOURCE_ROOT PROTO_DEPEND) - set(multi_value_args PROTO_FILES) - cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) - - if (NOT ARG_PROTO_FILES) - message(SEND_ERROR "GENERATE_PROTO_CPP() called without any proto files") - endif () - - if (NOT ARG_SOURCE_ROOT) - set(ARG_SOURCE_ROOT ${CMAKE_CURRENT_SOURCE_DIR}) - endif() - - set(${SRCS}) - set(${HDRS}) - set(_PROTO_IMPORT_ARGS -I "${ARG_SOURCE_ROOT}") - - # Add protobuf import dir to avoid import report by protoc compiler. - foreach (_PROTO_FILE ${ARG_PROTO_FILES}) - get_filename_component(_ABS_FILE ${_PROTO_FILE} ABSOLUTE) - get_filename_component(_ABS_PATH ${_ABS_FILE} PATH) - list(FIND _PROTO_IMPORT_ARGS ${_ABS_PATH} _IMPORT_EXIST) - if (${_IMPORT_EXIST} EQUAL -1) - list(APPEND _PROTO_IMPORT_ARGS -I ${_ABS_PATH}) - endif() - endforeach() - - foreach (_PROTO_FILE ${ARG_PROTO_FILES}) - get_filename_component(_ABS_FILE ${_PROTO_FILE} ABSOLUTE) - get_filename_component(_ABS_DIR ${_PROTO_FILE} DIRECTORY) - get_filename_component(_PROTO_NAME ${_PROTO_FILE} NAME_WE) - get_filename_component(_PROTO_DIR ${_PROTO_FILE} PATH) - file(RELATIVE_PATH _REL_DIR ${ARG_SOURCE_ROOT} ${_ABS_DIR}) - file(MAKE_DIRECTORY ${TARGET_DIR}/${_REL_DIR}) - list(APPEND ${SRCS} ${TARGET_DIR}/${_REL_DIR}/${_PROTO_NAME}.pb.cc) - list(APPEND ${HDRS} ${TARGET_DIR}/${_REL_DIR}/${_PROTO_NAME}.pb.h) - add_custom_command( - OUTPUT "${TARGET_DIR}/${_REL_DIR}/${_PROTO_NAME}.pb.cc" "${TARGET_DIR}/${_REL_DIR}/${_PROTO_NAME}.pb.h" - COMMAND ${CMAKE_COMMAND} -E env LD_LIBRARY_PATH=${Protobuf_LIB_PATH}:$ENV{LD_LIBRARY_PATH} - $ - ARGS ${_PROTO_IMPORT_ARGS} --cpp_out=${TARGET_DIR} ${_ABS_FILE} - DEPENDS ${_ABS_FILE} - COMMENT "Running c++ protocol buffer compiler on ${_PROTO_FILE}" VERBATIM) - - if (ARG_PROTO_DEPEND) - add_custom_target(PROTO_LIB_DEPEND_${_PROTO_NAME} DEPENDS - "${TARGET_DIR}/${_PROTO_NAME}.pb.cc" - "${TARGET_DIR}/${_PROTO_NAME}.pb.h") - add_dependencies(${ARG_PROTO_DEPEND} PROTO_LIB_DEPEND_${_PROTO_NAME}) - endif() - endforeach () - - set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE) - set(${SRCS} ${${SRCS}} PARENT_SCOPE) - set(${HDRS} ${${HDRS}} PARENT_SCOPE) -endfunction() diff --git a/cmake/version.cmake.in b/cmake/version.cmake.in deleted file mode 100644 index a7228060accbb8d532232add1d1397dd9e0b27d5..0000000000000000000000000000000000000000 --- a/cmake/version.cmake.in +++ /dev/null @@ -1,13 +0,0 @@ -# @PROJECT_NAME@ CMake configuration version file - -set(PACKAGE_VERSION "@DATASYSTEM_VERSION@") - -# Check whether the requested PACKAGE_FIND_VERSION is compatible -if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") - set(PACKAGE_VERSION_COMPATIBLE FALSE) -else() - set(PACKAGE_VERSION_COMPATIBLE TRUE) - if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") - set(PACKAGE_VERSION_EXACT TRUE) - endif() -endif() \ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 9234272fe0938bf8854fc31de6e0a04ca551ac1b..0000000000000000000000000000000000000000 --- a/docs/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first three. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR ?= source_zh_cn -BUILDDIR := $(patsubst source_%,build_%,$(SOURCEDIR)) - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @echo "SOURCEDIR = $(SOURCEDIR)" - @echo "BUILDDIR = $(BUILDDIR)" - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - @echo "Open $(BUILDDIR)/html/index.html in browser to view the contents." diff --git a/docs/README_CN.md b/docs/README_CN.md deleted file mode 100644 index 8d95ef97b47ef3991734fa0288f156c36c9fce85..0000000000000000000000000000000000000000 --- a/docs/README_CN.md +++ /dev/null @@ -1,69 +0,0 @@ -# openYuanrong datasystem 文档 - -## 简介 -此目录用于生成 openYuanrong datasystem 的中文文档以及英文文档。 - -## 目录结构说明 -```text -docs -├── _ext // sphinx自定义扩展文件 -├── source_en // 英文文档目录 -├── source_zh_cn // 中文文档目录 -├── _static // sphinx静态资源 -├── Makefile // docs构建文件 -├── README_CN.md // docs说明 -└── requirements.txt // docs依赖项 -``` - -## 文档构建 - -openYuanrong datasystem的教程和API文档均可由[Sphinx](https://www.sphinx-doc.org/en/master/)工具生成,操作前需完成openYuanrong datasystem的安装。 - -1. 使用pip安装openYuanrong datasystem模块,API文档需要根据安装后的openYuanrong datasystem模块生成,参考[安装](source_zh_cn/getting-started/install.md)。 - - ```bash - pip install openyuanrong_datasystem-*.whl - ``` - -2. 安装Doxygen - - - 使用系统包管理器安装: - ```bash - sudo yum install doxygen - ``` - - 源码安装: - ```bash - # 安装依赖 - sudo yum groupinstall "Development Tools" - sudo yum install cmake git flex bison - - # 下载源码,推荐版本为1.9.6 - git clone -b Release_1_9_6 https://github.com/doxygen/doxygen.git - cd doxygen - mkdir build - cd build - cmake .. - make -j$(nproc) - sudo make install - ``` - -3. 进入文档所在目录`yuanrong-datasystem/docs`,安装该目录下`requirements.txt`文件中的依赖项 - - ```bash - cd yuanrong-datasystem/docs - pip install -r requirements.txt - ``` - -4. 进入文档所在目录`yuanrong-datasystem/docs`下执行如下命令进行文档构建: - - - 构建中文文档: - ```bash - make html - ``` - 完成后会新建`build_zh_cn/html`目录,该目录中存放了生成后的中文文档网页,打开`build_zh_cn/html/index.html`即可查看文档内容。 - - - 构建英文文档: - ```bash - make html SOURCEDIR=source_en - ``` - 完成后会新建`build_en/html`目录,该目录中存放了生成后的英文文档网页,打开`build_en/html/index.html`即可查看文档内容。 \ No newline at end of file diff --git a/docs/_ext/customdocumenter.txt b/docs/_ext/customdocumenter.txt deleted file mode 100644 index 2d37ae41f6772a21da2a7dc5c7bff75128e68330..0000000000000000000000000000000000000000 --- a/docs/_ext/customdocumenter.txt +++ /dev/null @@ -1,245 +0,0 @@ -import re -import os -from sphinx.ext.autodoc import Documenter - - -class CustomDocumenter(Documenter): - - def document_members(self, all_members: bool = False) -> None: - """Generate reST for member documentation. - - If *all_members* is True, do all members, else those given by - *self.options.members*. - """ - # set current namespace for finding members - self.env.temp_data['autodoc:module'] = self.modname - if self.objpath: - self.env.temp_data['autodoc:class'] = self.objpath[0] - - want_all = all_members or self.options.inherited_members or \ - self.options.members is ALL - # find out which members are documentable - members_check_module, members = self.get_object_members(want_all) - - # **** 排除已写中文接口名 **** - file_path = os.path.join(self.env.app.srcdir, self.env.docname+'.rst') - exclude_re = re.compile(r'(.. py:class::|.. py:function::)\s+(.*?)(\(|\n)') - includerst_re = re.compile(r'.. include::\s+(.*?)\n') - with open(file_path, 'r', encoding='utf-8') as f: - content = f.read() - excluded_members = exclude_re.findall(content) - if excluded_members: - excluded_members = [i[1].split('.')[-1] for i in excluded_members] - rst_included = includerst_re.findall(content) - if rst_included: - for i in rst_included: - include_path = os.path.join(os.path.dirname(file_path), i) - if os.path.exists(include_path): - with open(include_path, 'r', encoding='utf8') as g: - content_ = g.read() - excluded_member_ = exclude_re.findall(content_) - if excluded_member_: - excluded_member_ = [j[1].split('.')[-1] for j in excluded_member_] - excluded_members.extend(excluded_member_) - - if excluded_members: - if self.options.exclude_members: - self.options.exclude_members |= set(excluded_members) - else: - self.options.exclude_members = excluded_members - - # remove members given by exclude-members - if self.options.exclude_members: - members = [ - (membername, member) for (membername, member) in members - if ( - self.options.exclude_members is ALL or - membername not in self.options.exclude_members - ) - ] - - # document non-skipped members - memberdocumenters = [] # type: List[Tuple[Documenter, bool]] - for (mname, member, isattr) in self.filter_members(members, want_all): - classes = [cls for cls in self.documenters.values() - if cls.can_document_member(member, mname, isattr, self)] - if not classes: - # don't know how to document this member - continue - # prefer the documenter with the highest priority - classes.sort(key=lambda cls: cls.priority) - # give explicitly separated module name, so that members - # of inner classes can be documented - full_mname = self.modname + '::' + \ - '.'.join(self.objpath + [mname]) - documenter = classes[-1](self.directive, full_mname, self.indent) - memberdocumenters.append((documenter, isattr)) - member_order = self.options.member_order or \ - self.env.config.autodoc_member_order - if member_order == 'groupwise': - # sort by group; relies on stable sort to keep items in the - # same group sorted alphabetically - memberdocumenters.sort(key=lambda e: e[0].member_order) - elif member_order == 'bysource' and self.analyzer: - # sort by source order, by virtue of the module analyzer - tagorder = self.analyzer.tagorder - - def keyfunc(entry: Tuple[Documenter, bool]) -> int: - fullname = entry[0].name.split('::')[1] - return tagorder.get(fullname, len(tagorder)) - memberdocumenters.sort(key=keyfunc) - - for documenter, isattr in memberdocumenters: - documenter.generate( - all_members=True, real_modname=self.real_modname, - check_module=members_check_module and not isattr) - - # reset current objects - self.env.temp_data['autodoc:module'] = None - self.env.temp_data['autodoc:class'] = None - - def generate(self, more_content: Any = None, real_modname: str = None, - check_module: bool = False, all_members: bool = False) -> None: - """Generate reST for the object given by *self.name*, and possibly for - its members. - - If *more_content* is given, include that content. If *real_modname* is - given, use that module name to find attribute docs. If *check_module* is - True, only generate if the object is defined in the module name it is - imported from. If *all_members* is True, document all members. - """ - if not self.parse_name(): - # need a module to import - logger.warning( - __('don\'t know which module to import for autodocumenting ' - '%r (try placing a "module" or "currentmodule" directive ' - 'in the document, or giving an explicit module name)') % - self.name, type='autodoc') - return - - # now, import the module and get object to document - if not self.import_object(): - return - - # If there is no real module defined, figure out which to use. - # The real module is used in the module analyzer to look up the module - # where the attribute documentation would actually be found in. - # This is used for situations where you have a module that collects the - # functions and classes of internal submodules. - self.real_modname = real_modname or self.get_real_modname() # type: str - - # try to also get a source code analyzer for attribute docs - try: - self.analyzer = ModuleAnalyzer.for_module(self.real_modname) - # parse right now, to get PycodeErrors on parsing (results will - # be cached anyway) - self.analyzer.find_attr_docs() - except PycodeError as err: - logger.debug('[autodoc] module analyzer failed: %s', err) - # no source file -- e.g. for builtin and C modules - self.analyzer = None - # at least add the module.__file__ as a dependency - if hasattr(self.module, '__file__') and self.module.__file__: - self.directive.filename_set.add(self.module.__file__) - else: - self.directive.filename_set.add(self.analyzer.srcname) - - # check __module__ of object (for members not given explicitly) - if check_module: - if not self.check_module(): - return - - # document members, if possible - self.document_members(all_members) - - -class ModuleDocumenter(CustomDocumenter): - """ - Specialized Documenter subclass for modules. - """ - objtype = 'module' - content_indent = '' - titles_allowed = True - - option_spec = { - 'members': members_option, 'undoc-members': bool_option, - 'noindex': bool_option, 'inherited-members': bool_option, - 'show-inheritance': bool_option, 'synopsis': identity, - 'platform': identity, 'deprecated': bool_option, - 'member-order': identity, 'exclude-members': members_set_option, - 'private-members': bool_option, 'special-members': members_option, - 'imported-members': bool_option, 'ignore-module-all': bool_option - } # type: Dict[str, Callable] - - def __init__(self, *args: Any) -> None: - super().__init__(*args) - merge_members_option(self.options) - - @classmethod - def can_document_member(cls, member: Any, membername: str, isattr: bool, parent: Any - ) -> bool: - # don't document submodules automatically - return False - - def resolve_name(self, modname: str, parents: Any, path: str, base: Any - ) -> Tuple[str, List[str]]: - if modname is not None: - logger.warning(__('"::" in automodule name doesn\'t make sense'), - type='autodoc') - return (path or '') + base, [] - - def parse_name(self) -> bool: - ret = super().parse_name() - if self.args or self.retann: - logger.warning(__('signature arguments or return annotation ' - 'given for automodule %s') % self.fullname, - type='autodoc') - return ret - - def add_directive_header(self, sig: str) -> None: - Documenter.add_directive_header(self, sig) - - sourcename = self.get_sourcename() - - # add some module-specific options - if self.options.synopsis: - self.add_line(' :synopsis: ' + self.options.synopsis, sourcename) - if self.options.platform: - self.add_line(' :platform: ' + self.options.platform, sourcename) - if self.options.deprecated: - self.add_line(' :deprecated:', sourcename) - - def get_object_members(self, want_all: bool) -> Tuple[bool, List[Tuple[str, object]]]: - if want_all: - if (self.options.ignore_module_all or not - hasattr(self.object, '__all__')): - # for implicit module members, check __module__ to avoid - # documenting imported objects - return True, get_module_members(self.object) - else: - memberlist = self.object.__all__ - # Sometimes __all__ is broken... - if not isinstance(memberlist, (list, tuple)) or not \ - all(isinstance(entry, str) for entry in memberlist): - logger.warning( - __('__all__ should be a list of strings, not %r ' - '(in module %s) -- ignoring __all__') % - (memberlist, self.fullname), - type='autodoc' - ) - # fall back to all members - return True, get_module_members(self.object) - else: - memberlist = self.options.members or [] - ret = [] - for mname in memberlist: - try: - ret.append((mname, safe_getattr(self.object, mname))) - except AttributeError: - logger.warning( - __('missing attribute mentioned in :members: or __all__: ' - 'module %s, attribute %s') % - (safe_getattr(self.object, '__name__', '???'), mname), - type='autodoc' - ) - return False, ret diff --git a/docs/_ext/myautosummary.py b/docs/_ext/myautosummary.py deleted file mode 100644 index c023efeafe2a1956d0a9746736b819d8370996ed..0000000000000000000000000000000000000000 --- a/docs/_ext/myautosummary.py +++ /dev/null @@ -1,500 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -Customized autosummary directives for sphinx. -""" - -import os -import re -from typing import List, Tuple - -from docutils.nodes import Node -from sphinx.ext.autodoc.directive import DocumenterBridge, Options -from sphinx.ext.autosummary import (Autosummary, Matcher, ModuleAnalyzer, - ModuleType, PycodeError, StringList, - addnodes, autosummary_table, - autosummary_toc, extract_summary, - get_documenter, - get_import_prefixes_from_env, - import_by_name, logger, mangle_signature, - mock, nodes, posixpath, rst, - switch_source_input) -from sphinx.locale import __ - - -MAX_ITEM_CHARS = 50 - - -class DsAutosummary(Autosummary): - """ - Inherited from sphinx's autosummary, add titles and a column for the generated table. - """ - - def init(self): - """ - init method - """ - self.find_doc_name = "" - self.third_title = "" - self.default_doc = "" - - def extract_env_summary(self, doc: List[str]) -> str: - """Extract env summary from docstring.""" - env_sum = self.default_doc - for i, piece in enumerate(doc): - if piece.startswith(self.find_doc_name): - env_sum = doc[i+1][4:] - return env_sum - - def run(self): - """ - run method - """ - self.init() - self.bridge = DocumenterBridge(self.env, self.state.document.reporter, - Options(), self.lineno, self.state) - - names = [x.strip().split()[0] for x in self.content if x.strip() and re.search(r'^[~a-zA-Z_]', x.strip()[0])] - items = self.get_items(names) - teble_nodes = self.get_table(items) - - if 'toctree' not in self.options: - return teble_nodes - - dirname = posixpath.dirname(self.env.docname) - - tree_prefix = self.options['toctree'].strip() - docnames = [] - excluded = Matcher(self.config.exclude_patterns) - for item in items: - docname = posixpath.join(tree_prefix, item[3]) - docname = posixpath.normpath(posixpath.join(dirname, docname)) - if docname not in self.env.found_docs: - location = self.state_machine.get_source_and_line(self.lineno) - if excluded(self.env.doc2path(docname, None)): - msg = __('autosummary references excluded document %r. Ignored.') - else: - msg = __('autosummary: stub file not found %r. ' - 'Check your autosummary_generate setting.') - logger.warning(msg, item[3], location=location) - continue - docnames.append(docname) - - if docnames: - tocnode = addnodes.toctree() - tocnode['includefiles'] = docnames - tocnode['entries'] = [(None, docn) for docn in docnames] - tocnode['maxdepth'] = -1 - tocnode['glob'] = None - teble_nodes.append(autosummary_toc('', '', tocnode)) - return teble_nodes - - def get_items(self, names: List[str]) -> List[Tuple[str, str, str, str, str]]: - """Try to import the given names, and return a list of - ``[(name, signature, summary_string, real_name, env_summary), ...]``. - """ - prefixes = get_import_prefixes_from_env(self.env) - items = [] # type: List[Tuple[str, str, str, str, str]] - - for name in names: - display_name = name - if name.startswith('~'): - name = name[1:] - display_name = name.split('.')[-1] - try: - with mock(self.config.autosummary_mock_imports): - real_name, obj, parent, modname = import_by_name(name, prefixes=prefixes) - except ImportError: - logger.warning(__('failed to import %s'), name) - items.append((name, '', '', name, '')) - continue - - self.bridge.result = StringList() # initialize for each documenter - # give explicitly separated module name, so that members - # of inner classes can be documented - full_name = f"{modname}::{full_name[len(modname) + 1:]}" if not isinstance(obj, ModuleType) else real_name - # NB. using full_name here is important, since Documenters - # handle module prefixes slightly differently - doccls = get_documenter(self.env.app, obj, parent) - documenter = doccls(self.bridge, full_name) - - if not documenter.parse_name(): - logger.warning(__('failed to parse name %s'), real_name) - items.append((display_name, '', '', real_name, '')) - continue - if not documenter.import_object(): - logger.warning(__('failed to import object %s'), real_name) - items.append((display_name, '', '', real_name, '')) - continue - if documenter.options.members and not documenter.check_module(): - continue - - # try to also get a source code analyzer for attribute docs - try: - documenter.analyzer = ModuleAnalyzer.for_module(documenter.get_real_modname()) - # parse right now, to get PycodeErrors on parsing (results will - # be cached anyway) - documenter.analyzer.find_attr_docs() - except PycodeError as err: - logger.debug('[autodoc] module analyzer failed: %s', err) - # no source file -- e.g. for builtin and C modules - documenter.analyzer = None - - # -- Grab the signature - - try: - sig = documenter.format_signature(show_annotation=False) - except TypeError: - # the documenter does not support ``show_annotation`` option - sig = documenter.format_signature() - - if not sig: - sig = '' - else: - sig = mangle_signature(sig, max_chars=max(10, MAX_ITEM_CHARS - len(display_name))) - - # -- Grab the summary - - documenter.add_content(None) - summary = extract_summary(self.bridge.result.data[:], self.state.document) - env_sum = self.extract_env_summary(self.bridge.result.data[:]) - items.append((display_name, sig, summary, real_name, env_sum)) - - return items - - def get_table(self, items: List[Tuple[str, str, str, str, str]]) -> List[Node]: - """Generate a proper list of table nodes for autosummary:: directive. - - *items* is a list produced by :meth:`get_items`. - """ - table_spec = addnodes.tabular_col_spec() - table_spec['spec'] = r'\X{1}{2}\X{1}{2}' - - table = autosummary_table('') - real_table = nodes.table('', classes=['longtable']) - table.append(real_table) - group = nodes.tgroup('', cols=3) - real_table.append(group) - group.append(nodes.colspec('', colwidth=10)) - group.append(nodes.colspec('', colwidth=70)) - group.append(nodes.colspec('', colwidth=30)) - body = nodes.tbody('') - group.append(body) - - def append_row(*column_texts: str) -> None: - row = nodes.row('', color="red") - source, line = self.state_machine.get_source_and_line() - for text in column_texts: - node = nodes.paragraph('') - vl = StringList() - vl.append(text, '%s:%d:' % (source, line)) - with switch_source_input(self.state, vl): - self.state.nested_parse(vl, 0, node) - if node and isinstance(node[0], nodes.paragraph): - node = node[0] - row.append(nodes.entry('', node)) - body.append(row) - - # add table's title - append_row("**API Name**", "**Description**", self.third_title) - for name, sig, summary, real_name, env_sum in items: - qualifier = 'obj' - if 'nosignatures' not in self.options: - col1 = ':%s:`%s <%s>`\\ %s' % (qualifier, name, real_name, rst.escape(sig)) - else: - col1 = ':%s:`%s <%s>`' % (qualifier, name, real_name) - col2 = summary - col3 = env_sum - append_row(col1, col2, col3) - - return [table_spec, table] - - -class DsNoteAutoSummary(DsAutosummary): - """ - Inherited from DsAutosummary. Add a third column about `Note` to the table. - """ - - def init(self): - """ - init method - """ - self.find_doc_name = ".. note::" - self.third_title = "**Note**" - self.default_doc = "None" - - def extract_env_summary(self, doc: List[str]) -> str: - """Extract env summary from docstring.""" - env_sum = self.default_doc - for piece in doc: - if piece.startswith(self.find_doc_name): - env_sum = piece[10:] - return env_sum - - -class DsPlatformAutoSummary(DsAutosummary): - """ - Inherited from DsAutosummary. Add a third column about `Supported Platforms` to the table. - """ - def init(self): - """ - init method - """ - self.find_doc_name = "Supported Platforms:" - self.third_title = "**{}**".format(self.find_doc_name[:-1]) - self.default_doc = "``Ascend`` ``GPU`` ``CPU``" - - -class DsCnAutoSummary(Autosummary): - """Overwrite MsPlatformAutosummary for chinese python api.""" - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.table_head = () - self.find_doc_name = "" - self.third_title = "" - self.default_doc = "" - self.third_name_en = "" - - def get_third_column_en(self, doc): - """Get the third column for en.""" - third_column = self.default_doc - for i, piece in enumerate(doc): - if piece.startswith(self.third_name_en): - try: - if "eprecated" in doc[i+1][4:]: - third_column = "弃用" - else: - third_column = doc[i+1][4:] - except IndexError: - third_column = '' - return third_column - - def get_summary_re(self, display_name: str): - """Get the summary""" - return re.compile(rf'\.\. \w+:\w+::\s+{display_name}.*?\n\n\s+(.*?)[。\n]') - - def run(self) -> List[Node]: - """Run this program""" - self.bridge = DocumenterBridge(self.env, self.state.document.reporter, - Options(), self.lineno, self.state) - - names = [x.strip().split()[0] for x in self.content if x.strip() and re.search(r'^[~a-zA-Z_]', x.strip()[0])] - items = self.get_items(names) - table_nodes = self.get_table(items) - - dirname = posixpath.dirname(self.env.docname) - - tree_prefix = self.options['toctree'].strip() - docnames = [] - names = [i[0] for i in items] - for name in names: - docname = posixpath.join(tree_prefix, name) - docname = posixpath.normpath(posixpath.join(dirname, docname)) - if docname not in self.env.found_docs: - continue - - docnames.append(docname) - - if docnames: - tocnode = addnodes.toctree() - tocnode['includefiles'] = docnames - tocnode['entries'] = [(None, docn) for docn in docnames] - tocnode['maxdepth'] = -1 - tocnode['glob'] = None - - table_nodes.append(autosummary_toc('', '', tocnode)) - - return table_nodes - - def get_items(self, names: List[str]) -> List[Tuple[str, str, str, str]]: - """Try to import the given names, and return a list of - ``[(name, signature, summary_string, real_name), ...]``. - """ - doc_path = os.path.dirname(self.state.document.current_source) - prefixes = get_import_prefixes_from_env(self.env) - items = [] # type: List[Tuple[str, str, str, str]] - - for name in names: - display_name = name - if name.startswith('~'): - name = name[1:] - display_name = name.split('.')[-1] - - file_path = os.path.normpath(os.path.join(doc_path, self.options['toctree'], display_name+'.rst')) - if self.if_need_solve(doc_path, display_name): - items = self.get_summary_info(file_path, display_name, items) - else: - try: - with mock(self.config.autosummary_mock_imports): - real_name, obj, parent, modname = import_by_name(name, prefixes=prefixes) - except ImportError: - logger.warning(__('failed to import %s'), name) - items.append((name, '', '')) - continue - - self.bridge.result = StringList() # initialize for each documenter - full_name = real_name - if not isinstance(obj, ModuleType): - # give explicitly separated module name, so that members - # of inner classes can be documented - full_name = modname + '::' + full_name[len(modname) + 1:] - # NB. using full_name here is important, since Documenters - # handle module prefixes slightly differently - doccls = get_documenter(self.env.app, obj, parent) - documenter = doccls(self.bridge, full_name) - - if not documenter.parse_name(): - logger.warning(__('failed to parse name %s'), real_name) - items.append((display_name, '', '')) - continue - if not documenter.import_object(): - logger.warning(__('failed to import object %s'), real_name) - items.append((display_name, '', '')) - continue - if documenter.options.members and not documenter.check_module(): - continue - - # try to also get a source code analyzer for attribute docs - try: - documenter.analyzer = ModuleAnalyzer.for_module(documenter.get_real_modname()) - # parse right now, to get PycodeErrors on parsing (results will - # be cached anyway) - documenter.analyzer.find_attr_docs() - except PycodeError as err: - logger.debug('[autodoc] module analyzer failed: %s', err) - # no source file -- e.g. for builtin and C modules - documenter.analyzer = None - - # -- Grab the summary and third_colum - - documenter.add_content(None) - summary = extract_summary(self.bridge.result.data[:], self.state.document) - if self.table_head: - third_colum = self.get_third_column_en(self.bridge.result.data[:]) - items.append((display_name, summary, third_colum)) - else: - items.append((display_name, summary)) - - return items - - def if_need_solve(self, docpath: str, file: str) -> bool: - """If need solve""" - dir_name = self.options['toctree'] - origin_rst_files = self.env.config.rst_files - all_rst_files = self.env.found_docs - - spec_path = os.path.join('api_python', dir_name, file) - file_path = os.path.join(docpath, dir_name, file+'.rst') - generated_files = all_rst_files.difference(origin_rst_files) - return os.path.exists(file_path) and spec_path not in generated_files - - def get_summary_info( - self, file_path: str, file: str, - items: List[Tuple[str, str, str, - str]]) -> List[Tuple[str, str, str, str]]: - """Get the summary info.""" - summary_re_tag = re.compile(rf'\.\. \w+:\w+::\s+{file}.*?\n\s+:.*?:\n\n\s+(.*?)[。\n]') - summary_re_line = re.compile(rf'\.\. \w+:\w+::\s+{file}(?:.|\n|)+?\n\n\s+(.*?)[。\n]') - summary_re = self.get_summary_re(file) - content = '' - with open(file_path, 'r', encoding='utf-8') as f: - content = f.read() - if content: - summary_str = summary_re.findall(content) - summary_str_tag = summary_re_tag.findall(content) - summary_str_line = summary_re_line.findall(content) - if summary_str: - if re.findall("[::,,。.;;]", summary_str[0][-1]): - logger.warning(f"{file}接口的概述格式需调整") - summary_str = summary_str[0] + '。' - elif summary_str_tag: - if re.findall("[::,,。.;;]", summary_str_tag[0][-1]): - logger.warning(f"{file}接口的概述格式需调整") - summary_str = summary_str_tag[0] + '。' - elif summary_str_line: - if re.findall("[::,,。.;;]", summary_str_line[0][-1]): - logger.warning(f"{file}接口的概述格式需调整") - summary_str = summary_str_line[0] + '。' - else: - summary_str = '' - if not self.table_head: - items.append((file, summary_str)) - else: - third_str = self.get_third_column(file, content) - if third_str: - third_str = third_str[0] - else: - third_str = '' - - items.append((file, summary_str, third_str)) - - return items - - def get_table(self, items: List[Tuple[str, str, str]]) -> List[Node]: - """Generate a proper list of table nodes for autosummary:: directive. - - *items* is a list produced by :meth:`get_items`. - """ - table_spec = addnodes.tabular_col_spec() - table = autosummary_table('') - real_table = nodes.table('', classes=['longtable']) - table.append(real_table) - - if not self.table_head: - table_spec['spec'] = r'\X{1}{2}\X{1}{2}' - group = nodes.tgroup('', cols=2) - real_table.append(group) - group.append(nodes.colspec('', colwidth=10)) - group.append(nodes.colspec('', colwidth=90)) - else: - table_spec['spec'] = r'\X{1}{2}\X{1}{2}\X{1}{2}' - group = nodes.tgroup('', cols=3) - real_table.append(group) - group.append(nodes.colspec('', colwidth=10)) - group.append(nodes.colspec('', colwidth=60)) - group.append(nodes.colspec('', colwidth=30)) - body = nodes.tbody('') - group.append(body) - - def append_row(*column_texts: str) -> None: - row = nodes.row('') - source, line = self.state_machine.get_source_and_line() - for text in column_texts: - node = nodes.paragraph('') - vl = StringList() - vl.append(text, '%s:%d:' % (source, line)) - with switch_source_input(self.state, vl): - self.state.nested_parse(vl, 0, node) - if node and isinstance(node[0], nodes.paragraph): - node = node[0] - row.append(nodes.entry('', node)) - body.append(row) - append_row(*self.table_head) - if not self.table_head: - try: - for name, summary in items: - qualifier = 'obj' - col1 = ':%s:`%s <%s>`' % (qualifier, name, name) - col2 = summary - append_row(col1, col2) - except ValueError: - logger.warning(items) - else: - for name, summary, other in items: - qualifier = 'obj' - col1 = ':%s:`%s <%s>`' % (qualifier, name, name) - col2 = summary - col3 = other - append_row(col1, col2, col3) - return [table_spec, table] diff --git a/docs/_ext/overwriteautosummary_generate.txt b/docs/_ext/overwriteautosummary_generate.txt deleted file mode 100644 index bf895b945501ee9340cd601009f79c0dbbb693e4..0000000000000000000000000000000000000000 --- a/docs/_ext/overwriteautosummary_generate.txt +++ /dev/null @@ -1,716 +0,0 @@ -""" - sphinx.ext.autosummary.generate - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Usable as a library or script to generate automatic RST source files for - items referred to in autosummary:: directives. - - Each generated RST file contains a single auto*:: directive which - extracts the docstring of the referred item. - - Example Makefile rule:: - - generate: - sphinx-autogen -o source/generated source/*.rst - - :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import argparse -import importlib -import inspect -import locale -import os -import pkgutil -import pydoc -import re -import sys -import warnings -from gettext import NullTranslations -from os import path -from typing import Any, Dict, List, NamedTuple, Sequence, Set, Tuple, Type, Union - -from jinja2 import TemplateNotFound -from jinja2.sandbox import SandboxedEnvironment - -import sphinx.locale -from sphinx import __display_version__, package_dir -from sphinx.application import Sphinx -from sphinx.builders import Builder -from sphinx.config import Config -try: - from sphinx.deprecation import RemovedInSphinx50Warning -except ImportError: - class RemovedInSphinx50Warning(Warning): # 临时占位 - pass -from sphinx.ext.autodoc import Documenter -from sphinx.ext.autodoc.importer import import_module -try: - from exceptions import ImportExceptionGroup -except ImportError: - class ImportExceptionGroup(Exception): # 简单的回退实现 - pass -from sphinx.ext.autosummary import (get_documenter, import_by_name, - import_ivar_by_name) -from sphinx.locale import __ -from sphinx.pycode import ModuleAnalyzer, PycodeError -from sphinx.registry import SphinxComponentRegistry -from sphinx.util import logging, rst, split_full_qualified_name, get_full_modname -from sphinx.util.inspect import getall, safe_getattr -from sphinx.util.osutil import ensuredir -from sphinx.util.template import SphinxTemplateLoader - -logger = logging.getLogger(__name__) - - -class DummyApplication: - """Dummy Application class for sphinx-autogen command.""" - - def __init__(self, translator: NullTranslations) -> None: - self.config = Config() - self.registry = SphinxComponentRegistry() - self.messagelog: List[str] = [] - self.srcdir = "/" - self.translator = translator - self.verbosity = 0 - self._warncount = 0 - self.warningiserror = False - - self.config.add('autosummary_context', {}, True, None) - self.config.add('autosummary_filename_map', {}, True, None) - self.config.add('autosummary_ignore_module_all', True, 'env', bool) - self.config.add('docs_branch', '', True, None) - self.config.add('branch', '', True, None) - self.config.add('cst_module_name', '', True, None) - self.config.add('copy_repo', '', True, None) - self.config.add('giturl', '', True, None) - self.config.add('repo_whl', '', True, None) - self.config.init_values() - - def emit_firstresult(self, *args: Any) -> None: - pass - - -class AutosummaryEntry(NamedTuple): - name: str - path: str - template: str - recursive: bool - - -def setup_documenters(app: Any) -> None: - from sphinx.ext.autodoc import (AttributeDocumenter, ClassDocumenter, DataDocumenter, - DecoratorDocumenter, ExceptionDocumenter, - FunctionDocumenter, MethodDocumenter, ModuleDocumenter, - NewTypeAttributeDocumenter, NewTypeDataDocumenter, - PropertyDocumenter) - documenters: List[Type[Documenter]] = [ - ModuleDocumenter, ClassDocumenter, ExceptionDocumenter, DataDocumenter, - FunctionDocumenter, MethodDocumenter, NewTypeAttributeDocumenter, - NewTypeDataDocumenter, AttributeDocumenter, DecoratorDocumenter, PropertyDocumenter, - ] - for documenter in documenters: - app.registry.add_documenter(documenter.objtype, documenter) - - -def _simple_info(msg: str) -> None: - warnings.warn('_simple_info() is deprecated.', - RemovedInSphinx50Warning, stacklevel=2) - print(msg) - - -def _simple_warn(msg: str) -> None: - warnings.warn('_simple_warn() is deprecated.', - RemovedInSphinx50Warning, stacklevel=2) - print('WARNING: ' + msg, file=sys.stderr) - - -def _underline(title: str, line: str = '=') -> str: - if '\n' in title: - raise ValueError('Can only underline single lines') - return title + '\n' + line * len(title) - - -class AutosummaryRenderer: - """A helper class for rendering.""" - - def __init__(self, app: Union[Builder, Sphinx], template_dir: str = None) -> None: - if isinstance(app, Builder): - warnings.warn('The first argument for AutosummaryRenderer has been ' - 'changed to Sphinx object', - RemovedInSphinx50Warning, stacklevel=2) - if template_dir: - warnings.warn('template_dir argument for AutosummaryRenderer is deprecated.', - RemovedInSphinx50Warning, stacklevel=2) - - system_templates_path = [os.path.join(package_dir, 'ext', 'autosummary', 'templates')] - loader = SphinxTemplateLoader(app.srcdir, app.config.templates_path, - system_templates_path) - - self.env = SandboxedEnvironment(loader=loader) - self.env.filters['escape'] = rst.escape - self.env.filters['e'] = rst.escape - self.env.filters['underline'] = _underline - - if isinstance(app, (Sphinx, DummyApplication)): - if app.translator: - self.env.add_extension("jinja2.ext.i18n") - self.env.install_gettext_translations(app.translator) - elif isinstance(app, Builder): - if app.app.translator: - self.env.add_extension("jinja2.ext.i18n") - self.env.install_gettext_translations(app.app.translator) - - def exists(self, template_name: str) -> bool: - """Check if template file exists.""" - warnings.warn('AutosummaryRenderer.exists() is deprecated.', - RemovedInSphinx50Warning, stacklevel=2) - try: - self.env.get_template(template_name) - return True - except TemplateNotFound: - return False - - def render(self, template_name: str, context: Dict) -> str: - """Render a template file.""" - try: - template = self.env.get_template(template_name) - except TemplateNotFound: - try: - # objtype is given as template_name - template = self.env.get_template('autosummary/%s.rst' % template_name) - except TemplateNotFound: - # fallback to base.rst - template = self.env.get_template('autosummary/base.rst') - - return template.render(context) - - -# -- Generating output --------------------------------------------------------- - - -class ModuleScanner: - def __init__(self, app: Any, obj: Any) -> None: - self.app = app - self.object = obj - - def get_object_type(self, name: str, value: Any) -> str: - return get_documenter(self.app, value, self.object).objtype - - def is_skipped(self, name: str, value: Any, objtype: str) -> bool: - try: - return self.app.emit_firstresult('autodoc-skip-member', objtype, - name, value, False, {}) - except Exception as exc: - logger.warning(__('autosummary: failed to determine %r to be documented, ' - 'the following exception was raised:\n%s'), - name, exc, type='autosummary') - return False - - def scan(self, imported_members: bool) -> List[str]: - members = [] - for name in members_of(self.object, self.app.config): - try: - value = safe_getattr(self.object, name) - except AttributeError: - value = None - - objtype = self.get_object_type(name, value) - if self.is_skipped(name, value, objtype): - continue - - try: - if inspect.ismodule(value): - imported = True - elif safe_getattr(value, '__module__') != self.object.__name__: - imported = True - else: - imported = False - except AttributeError: - imported = False - - respect_module_all = not self.app.config.autosummary_ignore_module_all - if imported_members: - # list all members up - members.append(name) - elif imported is False: - # list not-imported members - members.append(name) - elif '__all__' in dir(self.object) and respect_module_all: - # list members that have __all__ set - members.append(name) - - return members - - -def members_of(obj: Any, conf: Config) -> Sequence[str]: - """Get the members of ``obj``, possibly ignoring the ``__all__`` module attribute - - Follows the ``conf.autosummary_ignore_module_all`` setting.""" - - if conf.autosummary_ignore_module_all: - return dir(obj) - else: - return getall(obj) or dir(obj) - - -def generate_autosummary_content(name: str, obj: Any, parent: Any, - template: AutosummaryRenderer, template_name: str, - imported_members: bool, app: Any, - recursive: bool, context: Dict, - modname: str = None, qualname: str = None) -> str: - doc = get_documenter(app, obj, parent) - - def skip_member(obj: Any, name: str, objtype: str) -> bool: - try: - return app.emit_firstresult('autodoc-skip-member', objtype, name, - obj, False, {}) - except Exception as exc: - logger.warning(__('autosummary: failed to determine %r to be documented, ' - 'the following exception was raised:\n%s'), - name, exc, type='autosummary') - return False - - def get_class_members(obj: Any) -> Dict[str, Any]: - members = sphinx.ext.autodoc.get_class_members(obj, [qualname], safe_getattr) - return {name: member.object for name, member in members.items()} - - def get_module_members(obj: Any) -> Dict[str, Any]: - members = {} - for name in members_of(obj, app.config): - try: - members[name] = safe_getattr(obj, name) - except AttributeError: - continue - return members - - def get_all_members(obj: Any) -> Dict[str, Any]: - if doc.objtype == "module": - return get_module_members(obj) - elif doc.objtype == "class": - return get_class_members(obj) - return {} - - def get_members(obj: Any, types: Set[str], include_public: List[str] = [], - imported: bool = True) -> Tuple[List[str], List[str]]: - items: List[str] = [] - public: List[str] = [] - - all_members = get_all_members(obj) - for name, value in all_members.items(): - documenter = get_documenter(app, value, obj) - if documenter.objtype in types: - # skip imported members if expected - if imported or getattr(value, '__module__', None) == obj.__name__: - skipped = skip_member(value, name, documenter.objtype) - if skipped is True: - pass - elif skipped is False: - # show the member forcedly - items.append(name) - public.append(name) - else: - items.append(name) - if name in include_public or not name.startswith('_'): - # considers member as public - public.append(name) - return public, items - - def get_module_attrs(members: Any) -> Tuple[List[str], List[str]]: - """Find module attributes with docstrings.""" - attrs, public = [], [] - try: - analyzer = ModuleAnalyzer.for_module(name) - attr_docs = analyzer.find_attr_docs() - for namespace, attr_name in attr_docs: - if namespace == '' and attr_name in members: - attrs.append(attr_name) - if not attr_name.startswith('_'): - public.append(attr_name) - except PycodeError: - pass # give up if ModuleAnalyzer fails to parse code - return public, attrs - - def get_modules(obj: Any) -> Tuple[List[str], List[str]]: - items: List[str] = [] - for _, modname, _ispkg in pkgutil.iter_modules(obj.__path__): - fullname = name + '.' + modname - try: - module = import_module(fullname) - if module and hasattr(module, '__sphinx_mock__'): - continue - except ImportError: - pass - - items.append(fullname) - public = [x for x in items if not x.split('.')[-1].startswith('_')] - return public, items - - ns: Dict[str, Any] = {} - ns.update(context) - - if doc.objtype == 'module': - scanner = ModuleScanner(app, obj) - ns['members'] = scanner.scan(imported_members) - ns['functions'], ns['all_functions'] = \ - get_members(obj, {'function'}, imported=imported_members) - ns['classes'], ns['all_classes'] = \ - get_members(obj, {'class'}, imported=imported_members) - ns['exceptions'], ns['all_exceptions'] = \ - get_members(obj, {'exception'}, imported=imported_members) - ns['attributes'], ns['all_attributes'] = \ - get_module_attrs(ns['members']) - ispackage = hasattr(obj, '__path__') - if ispackage and recursive: - ns['modules'], ns['all_modules'] = get_modules(obj) - elif doc.objtype == 'class': - ns['members'] = dir(obj) - ns['inherited_members'] = \ - set(dir(obj)) - set(obj.__dict__.keys()) - ns['methods'], ns['all_methods'] = \ - get_members(obj, {'method'}, ['__init__']) - ns['attributes'], ns['all_attributes'] = \ - get_members(obj, {'attribute', 'property'}) - - if modname is None or qualname is None: - modname, qualname = split_full_qualified_name(name) - - if doc.objtype in ('method', 'attribute', 'property'): - ns['class'] = qualname.rsplit(".", 1)[0] - - if doc.objtype in ('class',): - shortname = qualname - else: - shortname = qualname.rsplit(".", 1)[-1] - - ns['fullname'] = name - ns['module'] = modname - ns['objname'] = qualname - ns['name'] = shortname - - ns['objtype'] = doc.objtype - ns['underline'] = len(name) * '=' - - if template_name: - return template.render(template_name, ns) - else: - return template.render(doc.objtype, ns) - - -def generate_autosummary_docs(sources: List[str], output_dir: str = None, - suffix: str = '.rst', base_path: str = None, - builder: Builder = None, template_dir: str = None, - imported_members: bool = False, app: Any = None, - overwrite: bool = True, encoding: str = 'utf-8') -> None: - - if builder: - warnings.warn('builder argument for generate_autosummary_docs() is deprecated.', - RemovedInSphinx50Warning, stacklevel=2) - - if template_dir: - warnings.warn('template_dir argument for generate_autosummary_docs() is deprecated.', - RemovedInSphinx50Warning, stacklevel=2) - - showed_sources = list(sorted(sources)) - if len(showed_sources) > 20: - showed_sources = showed_sources[:10] + ['...'] + showed_sources[-10:] - logger.info(__('[autosummary] generating autosummary for: %s') % - ', '.join(showed_sources)) - - if output_dir: - logger.info(__('[autosummary] writing to %s') % output_dir) - - if base_path is not None: - sources = [os.path.join(base_path, filename) for filename in sources] - - template = AutosummaryRenderer(app) - - # read - items = find_autosummary_in_files(sources) - - # keep track of new files - new_files = [] - - if app: - filename_map = app.config.autosummary_filename_map - else: - filename_map = {} - - # write - for entry in sorted(set(items), key=str): - if entry.path is None: - # The corresponding autosummary:: directive did not have - # a :toctree: option - continue - - path = output_dir or os.path.abspath(entry.path) - ensuredir(path) - - try: - name, obj, parent, modname = import_by_name(entry.name) - qualname = name.replace(modname + ".", "") - except ImportExceptionGroup as exc: - try: - # try to import as an instance attribute - name, obj, parent, modname = import_ivar_by_name(entry.name) - qualname = name.replace(modname + ".", "") - except ImportError as exc2: - if exc2.__cause__: - exceptions: List[BaseException] = exc.exceptions + [exc2.__cause__] - else: - exceptions = exc.exceptions + [exc2] - - errors = list(set("* %s: %s" % (type(e).__name__, e) for e in exceptions)) - logger.warning(__('[autosummary] failed to import %s.\nPossible hints:\n%s'), - entry.name, '\n'.join(errors)) - continue - - context: Dict[str, Any] = {} - if app: - context.update(app.config.autosummary_context) - - content = generate_autosummary_content(name, obj, parent, template, entry.template, - imported_members, app, entry.recursive, context, - modname, qualname) - try: - py_source_rel = get_full_modname(modname, qualname).replace('.', '/') + '.py' - except: - logger.warning(name) - py_source_rel = '' - - re_view = f"\n.. image:: https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/{app.config.docs_branch}/" + \ - f"resource/_static/logo_source_en.svg\n :target: " + app.config.giturl + \ - f"{app.config.copy_repo}/blob/{app.config.branch}/" + app.config.repo_whl + \ - py_source_rel.split(app.config.cst_module_name)[-1] + '\n :alt: View Source On Gitee\n\n' - - if re_view not in content and py_source_rel: - content = re.sub('([=]{5,})\n', r'\1\n' + re_view, content, 1) - filename = os.path.join(path, filename_map.get(name, name) + suffix) - if os.path.isfile(filename): - with open(filename, encoding=encoding) as f: - old_content = f.read() - - if content == old_content: - continue - elif overwrite: # content has changed - with open(filename, 'w', encoding=encoding) as f: - f.write(content) - new_files.append(filename) - else: - with open(filename, 'w', encoding=encoding) as f: - f.write(content) - new_files.append(filename) - - # descend recursively to new files - if new_files: - generate_autosummary_docs(new_files, output_dir=output_dir, - suffix=suffix, base_path=base_path, - builder=builder, template_dir=template_dir, - imported_members=imported_members, app=app, - overwrite=overwrite) - - -# -- Finding documented entries in files --------------------------------------- - -def find_autosummary_in_files(filenames: List[str]) -> List[AutosummaryEntry]: - """Find out what items are documented in source/*.rst. - - See `find_autosummary_in_lines`. - """ - documented: List[AutosummaryEntry] = [] - for filename in filenames: - with open(filename, encoding='utf-8', errors='ignore') as f: - lines = f.read().splitlines() - documented.extend(find_autosummary_in_lines(lines, filename=filename)) - return documented - - -def find_autosummary_in_docstring(name: str, module: str = None, filename: str = None - ) -> List[AutosummaryEntry]: - """Find out what items are documented in the given object's docstring. - - See `find_autosummary_in_lines`. - """ - if module: - warnings.warn('module argument for find_autosummary_in_docstring() is deprecated.', - RemovedInSphinx50Warning, stacklevel=2) - - try: - real_name, obj, parent, modname = import_by_name(name) - lines = pydoc.getdoc(obj).splitlines() - return find_autosummary_in_lines(lines, module=name, filename=filename) - except AttributeError: - pass - except ImportExceptionGroup as exc: - errors = list(set("* %s: %s" % (type(e).__name__, e) for e in exc.exceptions)) - print('Failed to import %s.\nPossible hints:\n%s' % (name, '\n'.join(errors))) - except SystemExit: - print("Failed to import '%s'; the module executes module level " - "statement and it might call sys.exit()." % name) - return [] - - -def find_autosummary_in_lines(lines: List[str], module: str = None, filename: str = None - ) -> List[AutosummaryEntry]: - """Find out what items appear in autosummary:: directives in the - given lines. - - Returns a list of (name, toctree, template) where *name* is a name - of an object and *toctree* the :toctree: path of the corresponding - autosummary directive (relative to the root of the file name), and - *template* the value of the :template: option. *toctree* and - *template* ``None`` if the directive does not have the - corresponding options set. - """ - autosummary_re = re.compile(r'^(\s*)\.\.\s+(ms[a-z]*)?autosummary::\s*') - automodule_re = re.compile( - r'^\s*\.\.\s+automodule::\s*([A-Za-z0-9_.]+)\s*$') - module_re = re.compile( - r'^\s*\.\.\s+(current)?module::\s*([a-zA-Z0-9_.]+)\s*$') - autosummary_item_re = re.compile(r'^\s+(~?[_a-zA-Z][a-zA-Z0-9_.]*)\s*.*?') - recursive_arg_re = re.compile(r'^\s+:recursive:\s*$') - toctree_arg_re = re.compile(r'^\s+:toctree:\s*(.*?)\s*$') - template_arg_re = re.compile(r'^\s+:template:\s*(.*?)\s*$') - - documented: List[AutosummaryEntry] = [] - - recursive = False - toctree: str = None - template = None - current_module = module - in_autosummary = False - base_indent = "" - - for line in lines: - if in_autosummary: - m = recursive_arg_re.match(line) - if m: - recursive = True - continue - - m = toctree_arg_re.match(line) - if m: - toctree = m.group(1) - if filename: - toctree = os.path.join(os.path.dirname(filename), - toctree) - continue - - m = template_arg_re.match(line) - if m: - template = m.group(1).strip() - continue - - if line.strip().startswith(':'): - continue # skip options - - m = autosummary_item_re.match(line) - if m: - name = m.group(1).strip() - if name.startswith('~'): - name = name[1:] - if current_module and \ - not name.startswith(current_module + '.'): - name = "%s.%s" % (current_module, name) - documented.append(AutosummaryEntry(name, toctree, template, recursive)) - continue - - if not line.strip() or line.startswith(base_indent + " "): - continue - - in_autosummary = False - - m = autosummary_re.match(line) - if m: - in_autosummary = True - base_indent = m.group(1) - recursive = False - toctree = None - template = None - continue - - m = automodule_re.search(line) - if m: - current_module = m.group(1).strip() - # recurse into the automodule docstring - documented.extend(find_autosummary_in_docstring( - current_module, filename=filename)) - continue - - m = module_re.match(line) - if m: - current_module = m.group(2) - continue - - return documented - - -def get_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser( - usage='%(prog)s [OPTIONS] ...', - epilog=__('For more information, visit .'), - description=__(""" -Generate ReStructuredText using autosummary directives. - -sphinx-autogen is a frontend to sphinx.ext.autosummary.generate. It generates -the reStructuredText files from the autosummary directives contained in the -given input files. - -The format of the autosummary directive is documented in the -``sphinx.ext.autosummary`` Python module and can be read using:: - - pydoc sphinx.ext.autosummary -""")) - - parser.add_argument('--version', action='version', dest='show_version', - version='%%(prog)s %s' % __display_version__) - - parser.add_argument('source_file', nargs='+', - help=__('source files to generate rST files for')) - - parser.add_argument('-o', '--output-dir', action='store', - dest='output_dir', - help=__('directory to place all output in')) - parser.add_argument('-s', '--suffix', action='store', dest='suffix', - default='rst', - help=__('default suffix for files (default: ' - '%(default)s)')) - parser.add_argument('-t', '--templates', action='store', dest='templates', - default=None, - help=__('custom template directory (default: ' - '%(default)s)')) - parser.add_argument('-i', '--imported-members', action='store_true', - dest='imported_members', default=False, - help=__('document imported members (default: ' - '%(default)s)')) - parser.add_argument('-a', '--respect-module-all', action='store_true', - dest='respect_module_all', default=False, - help=__('document exactly the members in module __all__ attribute. ' - '(default: %(default)s)')) - - return parser - - -def main(argv: List[str] = sys.argv[1:]) -> None: - sphinx.locale.setlocale(locale.LC_ALL, '') - sphinx.locale.init_console(os.path.join(package_dir, 'locale'), 'sphinx') - translator, _ = sphinx.locale.init([], None) - - app = DummyApplication(translator) - logging.setup(app, sys.stdout, sys.stderr) # type: ignore - setup_documenters(app) - args = get_parser().parse_args(argv) - - if args.templates: - app.config.templates_path.append(path.abspath(args.templates)) - app.config.autosummary_ignore_module_all = not args.respect_module_all # type: ignore - - generate_autosummary_docs(args.source_file, args.output_dir, - '.' + args.suffix, - imported_members=args.imported_members, - app=app) - - -if __name__ == '__main__': - main() diff --git a/docs/_ext/overwriteobjectiondirective.txt b/docs/_ext/overwriteobjectiondirective.txt deleted file mode 100644 index b648b03bda8e59422a4bbe91bc3b75ff3d99f628..0000000000000000000000000000000000000000 --- a/docs/_ext/overwriteobjectiondirective.txt +++ /dev/null @@ -1,440 +0,0 @@ -""" - sphinx.directives - ~~~~~~~~~~~~~~~~~ - - Handlers for additional ReST directives. - - :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re -import inspect -import importlib -from typing import TYPE_CHECKING, Any, Dict, Generic, List, Tuple, TypeVar, cast - -from docutils import nodes -from docutils.nodes import Node -from docutils.parsers.rst import directives, roles - -from sphinx import addnodes -from sphinx.addnodes import desc_signature -try: - from sphinx.deprecation import RemovedInSphinx50Warning -except ImportError: - class RemovedInSphinx50Warning(Warning): # 临时占位 - pass -from sphinx.util import docutils, logging -from sphinx.util.docfields import DocFieldTransformer, Field, TypedField -from sphinx.util.docutils import SphinxDirective -from sphinx.util.typing import OptionSpec - -if TYPE_CHECKING: - from sphinx.application import Sphinx - - -# RE to strip backslash escapes -nl_escape_re = re.compile(r'\\\n') -strip_backslash_re = re.compile(r'\\(.)') - -T = TypeVar('T') -logger = logging.getLogger(__name__) - -def optional_int(argument: str) -> int: - """ - Check for an integer argument or None value; raise ``ValueError`` if not. - """ - if argument is None: - return None - else: - value = int(argument) - if value < 0: - raise ValueError('negative value; must be positive or zero') - return value - -def get_api(fullname): - try: - module_name, api_name= ".".join(fullname.split('.')[:-1]), fullname.split('.')[-1] - module_import = importlib.import_module(module_name) - except ModuleNotFoundError: - module_name, api_name = ".".join(fullname.split('.')[:-2]), ".".join(fullname.split('.')[-2:]) - module_import = importlib.import_module(module_name) - api = eval(f"module_import.{api_name}") - return api - -def get_example(name: str): - try: - api_doc = inspect.getdoc(get_api(name)) - example_str = re.findall(r'Examples:\n([\w\W]*?)(\n\n|$)', api_doc) - if not example_str: - return [] - if '.. note::' in example_str[0][0]: - api_doc = re.sub(r'Examples:\n \.\. note::(?:.|\n)*? >>>', r'Examples:\n >>>', api_doc) - example_str = re.findall(r'(? Dict[str, Tuple[Field, bool]]: - if self._doc_field_type_map == {}: - self._doc_field_type_map = {} - for field in self.doc_field_types: - for name in field.names: - self._doc_field_type_map[name] = (field, False) - - if field.is_typed: - typed_field = cast(TypedField, field) - for name in typed_field.typenames: - self._doc_field_type_map[name] = (field, True) - - return self._doc_field_type_map - - def get_signatures(self) -> List[str]: - """ - Retrieve the signatures to document from the directive arguments. By - default, signatures are given as arguments, one per line. - - Backslash-escaping of newlines is supported. - """ - lines = nl_escape_re.sub('', self.arguments[0]).split('\n') - if self.config.strip_signature_backslash: - # remove backslashes to support (dummy) escapes; helps Vim highlighting - return [strip_backslash_re.sub(r'\1', line.strip()) for line in lines] - else: - return [line.strip() for line in lines] - - def handle_signature(self, sig: str, signode: desc_signature) -> Any: - """ - Parse the signature *sig* into individual nodes and append them to - *signode*. If ValueError is raised, parsing is aborted and the whole - *sig* is put into a single desc_name node. - - The return value should be a value that identifies the object. It is - passed to :meth:`add_target_and_index()` unchanged, and otherwise only - used to skip duplicates. - """ - raise ValueError - - def add_target_and_index(self, name: Any, sig: str, signode: desc_signature) -> None: - """ - Add cross-reference IDs and entries to self.indexnode, if applicable. - - *name* is whatever :meth:`handle_signature()` returned. - """ - return # do nothing by default - - def before_content(self) -> None: - """ - Called before parsing content. Used to set information about the current - directive context on the build environment. - """ - pass - - def transform_content(self, contentnode: addnodes.desc_content) -> None: - """ - Called after creating the content through nested parsing, - but before the ``object-description-transform`` event is emitted, - and before the info-fields are transformed. - Can be used to manipulate the content. - """ - pass - - def after_content(self) -> None: - """ - Called after parsing content. Used to reset information about the - current directive context on the build environment. - """ - pass - - def check_class_end(self, content): - for i in content: - if not i.startswith('.. include::') and i != "\n" and i != "": - return False - return True - - def extend_items(self, rst_file, start_num, num): - ls = [] - for i in range(1, num+1): - ls.append((rst_file, start_num+i)) - return ls - - def run(self) -> List[Node]: - """ - Main directive entry function, called by docutils upon encountering the - directive. - - This directive is meant to be quite easily subclassable, so it delegates - to several additional methods. What it does: - - * find out if called as a domain-specific directive, set self.domain - * create a `desc` node to fit all description inside - * parse standard options, currently `noindex` - * create an index node if needed as self.indexnode - * parse all given signatures (as returned by self.get_signatures()) - using self.handle_signature(), which should either return a name - or raise ValueError - * add index entries using self.add_target_and_index() - * parse the content and handle doc fields in it - """ - if ':' in self.name: - self.domain, self.objtype = self.name.split(':', 1) - else: - self.domain, self.objtype = '', self.name - self.indexnode = addnodes.index(entries=[]) - - node = addnodes.desc() - node.document = self.state.document - node['domain'] = self.domain - # 'desctype' is a backwards compatible attribute - node['objtype'] = node['desctype'] = self.objtype - node['noindex'] = noindex = ('noindex' in self.options) - if self.domain: - node['classes'].append(self.domain) - node['classes'].append(node['objtype']) - - self.names: List[T] = [] - signatures = self.get_signatures() - for sig in signatures: - # add a signature node for each signature in the current unit - # and add a reference target for it - signode = addnodes.desc_signature(sig, '') - self.set_source_info(signode) - node.append(signode) - try: - # name can also be a tuple, e.g. (classname, objname); - # this is strictly domain-specific (i.e. no assumptions may - # be made in this base class) - name = self.handle_signature(sig, signode) - except ValueError: - # signature parsing failed - signode.clear() - signode += addnodes.desc_name(sig, sig) - continue # we don't want an index entry here - if name not in self.names: - self.names.append(name) - if not noindex: - # only add target and index entry if this is the first - # description of the object with this name in this desc block - self.add_target_and_index(name, sig, signode) - - contentnode = addnodes.desc_content() - node.append(contentnode) - if self.names: - # needed for association of version{added,changed} directives - self.env.temp_data['object'] = self.names[0] - self.before_content() - try: - example = get_example(self.names[0][0]) - platforms = get_platforms(self.names[0][0]) - except Exception as e: - example = '' - platforms = '' - logger.warning(f'Error API names in {self.arguments[0]}.') - logger.warning(f'{e}') - extra = platforms + example - if "**样例:**" not in example and example: - try: - if self.objtype == "method": - index_platforms = 0 - for num, i in enumerate(self.content.data): - if i.startswith('样例:'): - index_platforms = num - break - if index_platforms and platforms: - self.content.data[index_platforms] = '**样例:**' - self.content.data.insert(index_platforms+1, '') - count = len(self.content.data) - for i in platforms: - self.content.data.insert(index_platforms-count, i) - else: - self.content.data[index_platforms] = '**样例:**' - self.content.data.insert(index_platforms+1, '') - self.content.data.extend(example) - else: - index_num = 0 - index_platforms = 0 - for num, i in enumerate(self.content.data): - if i.startswith('.. py:method::') or self.check_class_end(self.content.data[num:]): - index_num = num - break - if index_num: - for num, j in enumerate(self.content.data[:index_num]): - if j.startswith('样例:'): - index_platforms = num - break - if index_platforms and platforms: - self.content.data[index_platforms] = '**样例:**' - self.content.data.insert(index_platforms+1, '') - count = len(self.content.data) - for k in platforms: - self.content.data.insert(index_platforms-count, k) - else: - self.content.data[index_platforms] = '**样例:**' - self.content.data.insert(index_platforms+1, '') - count = len(self.content.data) - count_plat = len(platforms) - for i in example: - self.content.data.insert(index_num-count+count_plat, i) - else: - index_platforms = 0 - for num, i in enumerate(self.content.data): - if i.startswith('样例:'): - index_platforms = num - break - if index_platforms and platforms: - self.content.data[index_platforms] = '**样例:**' - self.content.data.insert(index_platforms+1, '') - count = len(self.content.data) - for i in platforms: - self.content.data.insert(index_platforms-count, i) - else: - self.content.data[index_platforms] = '**样例:**' - self.content.data.insert(index_platforms+1, '') - self.content.data.extend(example) - except Exception as e: - logger.warning(e) - elif extra: - if self.objtype == "method": - self.content.data.extend(extra) - else: - index_num = 0 - for num, i in enumerate(self.content.data): - if i.startswith('.. py:method::') or self.check_class_end(self.content.data[num:]): - index_num = num - break - if index_num: - count = len(self.content.data) - for i in extra: - self.content.data.insert(index_num-count, i) - else: - self.content.data.extend(extra) - try: - self.content.items.extend(self.extend_items(self.content.items[0][0], self.content.items[-1][1], len(extra))) - except Exception as e: - logger.warning(f'{e}') - self.state.nested_parse(self.content, self.content_offset, contentnode) - self.transform_content(contentnode) - self.env.app.emit('object-description-transform', - self.domain, self.objtype, contentnode) - DocFieldTransformer(self).transform_all(contentnode) - self.env.temp_data['object'] = None - self.after_content() - return [self.indexnode, node] - - -class DefaultRole(SphinxDirective): - """ - Set the default interpreted text role. Overridden from docutils. - """ - - optional_arguments = 1 - final_argument_whitespace = False - - def run(self) -> List[Node]: - if not self.arguments: - docutils.unregister_role('') - return [] - role_name = self.arguments[0] - role, messages = roles.role(role_name, self.state_machine.language, - self.lineno, self.state.reporter) - if role: - docutils.register_role('', role) - self.env.temp_data['default_role'] = role_name - else: - literal_block = nodes.literal_block(self.block_text, self.block_text) - reporter = self.state.reporter - error = reporter.error('Unknown interpreted text role "%s".' % role_name, - literal_block, line=self.lineno) - messages += [error] - - return cast(List[nodes.Node], messages) - - -class DefaultDomain(SphinxDirective): - """ - Directive to (re-)set the default domain for this source file. - """ - - has_content = False - required_arguments = 1 - optional_arguments = 0 - final_argument_whitespace = False - option_spec = {} # type: Dict - - def run(self) -> List[Node]: - domain_name = self.arguments[0].lower() - # if domain_name not in env.domains: - # # try searching by label - # for domain in env.domains.values(): - # if domain.label.lower() == domain_name: - # domain_name = domain.name - # break - self.env.temp_data['default_domain'] = self.env.domains.get(domain_name) - return [] - -def setup(app: "Sphinx") -> Dict[str, Any]: - app.add_config_value("strip_signature_backslash", False, 'env') - directives.register_directive('default-role', DefaultRole) - directives.register_directive('default-domain', DefaultDomain) - directives.register_directive('describe', ObjectDescription) - # new, more consistent, name - directives.register_directive('object', ObjectDescription) - - app.add_event('object-description-transform') - - return { - 'version': 'builtin', - 'parallel_read_safe': True, - 'parallel_write_safe': True, - } - diff --git a/docs/_ext/overwriteviewcode.txt b/docs/_ext/overwriteviewcode.txt deleted file mode 100644 index a12f1611b64630dfcd10467faec526d1f473d84a..0000000000000000000000000000000000000000 --- a/docs/_ext/overwriteviewcode.txt +++ /dev/null @@ -1,382 +0,0 @@ -""" - sphinx.ext.viewcode - ~~~~~~~~~~~~~~~~~~~ - - Add links to module code in Python object descriptions. - - :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import posixpath -import traceback -import warnings -from os import path -from typing import Any, Dict, Generator, Iterable, Optional, Set, Tuple, cast - -from docutils import nodes -from docutils.nodes import Element, Node - -import sphinx -from sphinx import addnodes -from sphinx.application import Sphinx -from sphinx.builders import Builder -from sphinx.builders.html import StandaloneHTMLBuilder -try: - from sphinx.deprecation import RemovedInSphinx50Warning -except ImportError: - class RemovedInSphinx50Warning(Warning): # 临时占位 - pass -from sphinx.environment import BuildEnvironment -from sphinx.locale import _, __ -from sphinx.pycode import ModuleAnalyzer -from sphinx.transforms.post_transforms import SphinxPostTransform -from sphinx.util import get_full_modname, logging, status_iterator -from sphinx.util.nodes import make_refnode - - -logger = logging.getLogger(__name__) - - -OUTPUT_DIRNAME = '_modules' - - -class viewcode_anchor(Element): - """Node for viewcode anchors. - - This node will be processed in the resolving phase. - For viewcode supported builders, they will be all converted to the anchors. - For not supported builders, they will be removed. - """ - - -def _get_full_modname(app: Sphinx, modname: str, attribute: str) -> Optional[str]: - try: - return get_full_modname(modname, attribute) - except AttributeError: - # sphinx.ext.viewcode can't follow class instance attribute - # then AttributeError logging output only verbose mode. - logger.verbose('Didn\'t find %s in %s', attribute, modname) - return None - except Exception as e: - # sphinx.ext.viewcode follow python domain directives. - # because of that, if there are no real modules exists that specified - # by py:function or other directives, viewcode emits a lot of warnings. - # It should be displayed only verbose mode. - logger.verbose(traceback.format_exc().rstrip()) - logger.verbose('viewcode can\'t import %s, failed with error "%s"', modname, e) - return None - - -def is_supported_builder(builder: Builder) -> bool: - if builder.format != 'html': - return False - elif builder.name == 'singlehtml': - return False - elif builder.name.startswith('epub') and not builder.config.viewcode_enable_epub: - return False - else: - return True - - -def doctree_read(app: Sphinx, doctree: Node) -> None: - env = app.builder.env - if not hasattr(env, '_viewcode_modules'): - env._viewcode_modules = {} # type: ignore - - def has_tag(modname: str, fullname: str, docname: str, refname: str) -> bool: - entry = env._viewcode_modules.get(modname, None) # type: ignore - if entry is False: - return False - - code_tags = app.emit_firstresult('viewcode-find-source', modname) - if code_tags is None: - try: - analyzer = ModuleAnalyzer.for_module(modname) - analyzer.find_tags() - except Exception: - env._viewcode_modules[modname] = False # type: ignore - return False - - code = analyzer.code - tags = analyzer.tags - else: - code, tags = code_tags - - if entry is None or entry[0] != code: - entry = code, tags, {}, refname - env._viewcode_modules[modname] = entry # type: ignore - _, tags, used, _ = entry - if fullname in tags: - used[fullname] = docname - return True - - return False - - for objnode in list(doctree.findall(addnodes.desc)): - if objnode.get('domain') != 'py': - continue - names: Set[str] = set() - for signode in objnode: - if not isinstance(signode, addnodes.desc_signature): - continue - modname = signode.get('module') - fullname = signode.get('fullname') - try: - if fullname and modname==None: - if fullname.split('.')[-1].lower() == fullname.split('.')[-1] and fullname.split('.')[-2].lower() != fullname.split('.')[-2]: - modname = '.'.join(fullname.split('.')[:-2]) - fullname = '.'.join(fullname.split('.')[-2:]) - else: - modname = '.'.join(fullname.split('.')[:-1]) - fullname = fullname.split('.')[-1] - fullname_new = fullname - except Exception: - logger.warning(f'error_modename:{modname}') - logger.warning(f'error_fullname:{fullname}') - refname = modname - if env.config.viewcode_follow_imported_members: - new_modname = app.emit_firstresult( - 'viewcode-follow-imported', modname, fullname, - ) - if not new_modname: - new_modname = _get_full_modname(app, modname, fullname) - modname = new_modname - # logger.warning(f'new_modename:{modname}') - if not modname: - continue - # fullname = signode.get('fullname') - # if fullname and modname==None: - fullname = fullname_new - if not has_tag(modname, fullname, env.docname, refname): - continue - if fullname in names: - # only one link per name, please - continue - names.add(fullname) - pagename = posixpath.join(OUTPUT_DIRNAME, modname.replace('.', '/')) - signode += viewcode_anchor(reftarget=pagename, refid=fullname, refdoc=env.docname) - - -def env_merge_info(app: Sphinx, env: BuildEnvironment, docnames: Iterable[str], - other: BuildEnvironment) -> None: - if not hasattr(other, '_viewcode_modules'): - return - # create a _viewcode_modules dict on the main environment - if not hasattr(env, '_viewcode_modules'): - env._viewcode_modules = {} # type: ignore - # now merge in the information from the subprocess - for modname, entry in other._viewcode_modules.items(): # type: ignore - if modname not in env._viewcode_modules: # type: ignore - env._viewcode_modules[modname] = entry # type: ignore - else: - if env._viewcode_modules[modname]: # type: ignore - used = env._viewcode_modules[modname][2] # type: ignore - for fullname, docname in entry[2].items(): - if fullname not in used: - used[fullname] = docname - - -def env_purge_doc(app: Sphinx, env: BuildEnvironment, docname: str) -> None: - modules = getattr(env, '_viewcode_modules', {}) - - for modname, entry in list(modules.items()): - if entry is False: - continue - - code, tags, used, refname = entry - for fullname in list(used): - if used[fullname] == docname: - used.pop(fullname) - - if len(used) == 0: - modules.pop(modname) - - -class ViewcodeAnchorTransform(SphinxPostTransform): - """Convert or remove viewcode_anchor nodes depends on builder.""" - default_priority = 100 - - def run(self, **kwargs: Any) -> None: - if is_supported_builder(self.app.builder): - self.convert_viewcode_anchors() - else: - self.remove_viewcode_anchors() - - def convert_viewcode_anchors(self) -> None: - for node in self.document.findall(viewcode_anchor): - anchor = nodes.inline('', _('[源代码]'), classes=['viewcode-link']) - refnode = make_refnode(self.app.builder, node['refdoc'], node['reftarget'], - node['refid'], anchor) - node.replace_self(refnode) - - def remove_viewcode_anchors(self) -> None: - for node in list(self.document.findall(viewcode_anchor)): - node.parent.remove(node) - - -def missing_reference(app: Sphinx, env: BuildEnvironment, node: Element, contnode: Node - ) -> Optional[Node]: - # resolve our "viewcode" reference nodes -- they need special treatment - if node['reftype'] == 'viewcode': - warnings.warn('viewcode extension is no longer use pending_xref node. ' - 'Please update your extension.', RemovedInSphinx50Warning) - return make_refnode(app.builder, node['refdoc'], node['reftarget'], - node['refid'], contnode) - - return None - - -def get_module_filename(app: Sphinx, modname: str) -> Optional[str]: - """Get module filename for *modname*.""" - source_info = app.emit_firstresult('viewcode-find-source', modname) - if source_info: - return None - else: - try: - filename, source = ModuleAnalyzer.get_module_source(modname) - return filename - except Exception: - return None - - -def should_generate_module_page(app: Sphinx, modname: str) -> bool: - """Check generation of module page is needed.""" - module_filename = get_module_filename(app, modname) - if module_filename is None: - # Always (re-)generate module page when module filename is not found. - return True - - builder = cast(StandaloneHTMLBuilder, app.builder) - basename = modname.replace('.', '/') + builder.out_suffix - page_filename = path.join(app.outdir, '_modules/', basename) - - try: - if path.getmtime(module_filename) <= path.getmtime(page_filename): - # generation is not needed if the HTML page is newer than module file. - return False - except IOError: - pass - - return True - - -def collect_pages(app: Sphinx) -> Generator[Tuple[str, Dict[str, Any], str], None, None]: - env = app.builder.env - if not hasattr(env, '_viewcode_modules'): - return - if not is_supported_builder(app.builder): - return - highlighter = app.builder.highlighter # type: ignore - urito = app.builder.get_relative_uri - - modnames = set(env._viewcode_modules) # type: ignore - - for modname, entry in status_iterator( - sorted(env._viewcode_modules.items()), # type: ignore - __('highlighting module code... '), "blue", - len(env._viewcode_modules), # type: ignore - app.verbosity, lambda x: x[0]): - if not entry: - continue - if not should_generate_module_page(app, modname): - continue - - code, tags, used, refname = entry - # construct a page name for the highlighted source - pagename = posixpath.join(OUTPUT_DIRNAME, modname.replace('.', '/')) - # highlight the source using the builder's highlighter - if env.config.highlight_language in ('python3', 'default', 'none'): - lexer = env.config.highlight_language - else: - lexer = 'python' - highlighted = highlighter.highlight_block(code, lexer, linenos=False) - # split the code into lines - lines = highlighted.splitlines() - # split off wrap markup from the first line of the actual code - before, after = lines[0].split('
')
-        lines[0:1] = [before + '
', after]
-        # nothing to do for the last line; it always starts with 
anyway - # now that we have code lines (starting at index 1), insert anchors for - # the collected tags (HACK: this only works if the tag boundaries are - # properly nested!) - maxindex = len(lines) - 1 - for name, docname in used.items(): - type, start, end = tags[name] - backlink = urito(pagename, docname) + '#' + refname + '.' + name - lines[start] = ( - '
%s' % (name, backlink, _('[文档]')) + - lines[start]) - lines[min(end, maxindex)] += '
' - # try to find parents (for submodules) - parents = [] - parent = modname - while '.' in parent: - parent = parent.rsplit('.', 1)[0] - if parent in modnames: - parents.append({ - 'link': urito(pagename, - posixpath.join(OUTPUT_DIRNAME, parent.replace('.', '/'))), - 'title': parent}) - parents.append({'link': urito(pagename, posixpath.join(OUTPUT_DIRNAME, 'index')), - 'title': _('Module code')}) - parents.reverse() - # putting it all together - context = { - 'parents': parents, - 'title': modname, - 'body': (_('

Source code for %s

') % modname + - '\n'.join(lines)), - } - yield (pagename, context, 'page.html') - - if not modnames: - return - - html = ['\n'] - # the stack logic is needed for using nested lists for submodules - stack = [''] - for modname in sorted(modnames): - if modname.startswith(stack[-1]): - stack.append(modname + '.') - html.append('
    ') - else: - stack.pop() - while not modname.startswith(stack[-1]): - stack.pop() - html.append('
') - stack.append(modname + '.') - html.append('
  • %s
  • \n' % ( - urito(posixpath.join(OUTPUT_DIRNAME, 'index'), - posixpath.join(OUTPUT_DIRNAME, modname.replace('.', '/'))), - modname)) - html.append('' * (len(stack) - 1)) - context = { - 'title': _('Overview: module code'), - 'body': (_('

    All modules for which code is available

    ') + - ''.join(html)), - } - - yield (posixpath.join(OUTPUT_DIRNAME, 'index'), context, 'page.html') - - -def setup(app: Sphinx) -> Dict[str, Any]: - app.add_config_value('viewcode_import', None, False) - app.add_config_value('viewcode_enable_epub', False, False) - app.add_config_value('viewcode_follow_imported_members', True, False) - app.connect('doctree-read', doctree_read) - app.connect('env-merge-info', env_merge_info) - app.connect('env-purge-doc', env_purge_doc) - app.connect('html-collect-pages', collect_pages) - app.connect('missing-reference', missing_reference) - # app.add_config_value('viewcode_include_modules', [], 'env') - # app.add_config_value('viewcode_exclude_modules', [], 'env') - app.add_event('viewcode-find-source') - app.add_event('viewcode-follow-imported') - app.add_post_transform(ViewcodeAnchorTransform) - return { - 'version': sphinx.__display_version__, - 'env_version': 1, - 'parallel_read_safe': True - } diff --git a/docs/_ext/rename_include.py b/docs/_ext/rename_include.py deleted file mode 100644 index bf7dea25f3ee7fd371659e80a3551439fbddee5a..0000000000000000000000000000000000000000 --- a/docs/_ext/rename_include.py +++ /dev/null @@ -1,60 +0,0 @@ -"""Rename .rst file to .txt file for include directive.""" -import os -import re -import glob -import logging - -logging.basicConfig(level=logging.WARNING, format='%(message)s') -logger = logging.getLogger(__name__) - -origin = "rst" -replace = "txt" - -include_re = re.compile(r'\.\. include::\s+(.*?)(\.rst|\.txt)') -include_re_sub = re.compile(rf'(\.\. include::\s+(.*?))\.{origin}') - -# Specified file_name lists excluded from rename procedure. -whitepaper = ['operations.rst'] - -def repl(matchobj): - """Replace functions for matched.""" - if matchobj.group(2).split('/')[-1] + f'.{origin}' in whitepaper: - return matchobj.group(0) - return rf'{matchobj.group(1)}.{replace}' - -def rename_include(api_dir): - """ - Rename .rst file to .txt file for include directive. - - api_dir - api path relative. - """ - tar = [] - for root, _, files in os.walk(api_dir): - for file in files: - if not file.endswith('.rst'): - continue - try: - with open(os.path.join(root, file), 'r+', encoding='utf-8') as f: - content = f.read() - tar_ = include_re.findall(content) - if tar_: - tar_ = [i[0].split('/')[-1]+f'.{origin}' for i in tar_] - tar.extend(tar_) - sub = include_re_sub.findall(content) - if sub: - content_ = include_re_sub.sub(repl, content) - f.seek(0) - f.truncate() - f.write(content_) - except UnicodeDecodeError: - # pylint: disable=logging-fstring-interpolation - logger.warning(f"UnicodeDecodeError for: {file}") - - all_rst = glob.glob(f'{api_dir}/**/*.{origin}', recursive=True) - - for i in all_rst: - if os.path.dirname(i).endswith("api_python") or os.path.basename(i) in whitepaper: - continue - name = os.path.basename(i) - if name in tar: - os.rename(i, i.replace(f'.{origin}', f'.{replace}')) diff --git a/docs/_static/custom.css b/docs/_static/custom.css deleted file mode 100644 index 1a0d764364572f62c86a307d391b21a993a1408c..0000000000000000000000000000000000000000 --- a/docs/_static/custom.css +++ /dev/null @@ -1,35 +0,0 @@ -/* 移除导航栏固定宽度限制 */ -.wy-nav-side { - width: auto !important; - min-width: 250px; /* 设置最小宽度 */ - max-width: 350px; /* 设置最大宽度防止过宽 */ - } - - /* 让导航菜单根据内容自适应 */ - .wy-menu-vertical { - width: auto !important; - white-space: nowrap; /* 初始不换行 */ - } - - /* 一级标题样式 */ - .wy-menu-vertical li.toctree-l1 > a { - white-space: nowrap; - padding-right: 20px; /* 为可能的滚动条留空间 */ - } - - /* 子标题允许换行 */ - .wy-menu-vertical li.toctree-l2 > a, - .wy-menu-vertical li.toctree-l3 > a { - white-space: normal; - word-wrap: break-word; - } - - /* 添加平滑过渡效果 */ - .wy-menu-vertical { - transition: width 0.3s ease; - } - - /* 鼠标悬停时临时展开 */ - .wy-nav-side:hover { - max-width: 500px; /* 悬停时可更宽 */ - } \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 70c89b2b2fd9a4b2cf4184345065c185c3071375..0000000000000000000000000000000000000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -sphinx>=5.3.0 -ipython -sphinx_rtd_theme -myst-parser -sphinx-design -breathe -exhale \ No newline at end of file diff --git a/docs/source_en/_templates/classtemplate.rst b/docs/source_en/_templates/classtemplate.rst deleted file mode 100644 index 43e5df5223f324c3653e63a3b328e3c84cb66fdf..0000000000000000000000000000000000000000 --- a/docs/source_en/_templates/classtemplate.rst +++ /dev/null @@ -1,21 +0,0 @@ -.. role:: hidden - :class: hidden-section - -.. currentmodule:: {{ module }} - -{% if objname[0].istitle() %} -{{ fullname | underline }} - -.. autoclass:: {{ name }} - :members: - -{% else %} -{{ fullname | underline }} - -.. autofunction:: {{ fullname }} - -{% endif %} - -.. - autogenerated from _templates/classtemplate.rst - note it does not have :inherited-members: diff --git a/docs/source_en/appendix/k8s_configuration.md b/docs/source_en/appendix/k8s_configuration.md deleted file mode 100644 index 3349d1689becbfa4cacd62916b065c015662d5c7..0000000000000000000000000000000000000000 --- a/docs/source_en/appendix/k8s_configuration.md +++ /dev/null @@ -1,491 +0,0 @@ -# openYuanrong datasystem Kubernetes Configuration - - -- [Minimal Configurations](#minimal-configurations) -- [Detailed Configurations](#detailed-configurations) - - [Image Configurations](#image-configurations) - - [Namespace Configurations](#namespace-configurations) - - [Resource Configurations](#resource-configurations) - - [IPC/RPC Configurations](#ipcrpc-configurations) - - [ETCD Configurations](#etcd-configurations) - - [Spill Configurations](#spill-configurations) - - [Log Configurations](#log-configurations) - - [L2 cache Configurations](#l2-cache-configurations) - - [AZ Configurations](#az-configurations) - - [Metadata Configurations](#metadata-configurations) - - [Reliability Configurations](#reliability-configurations) - - [Graceful Shutdown Configurations](#graceful-shutdown-configurations) - - [Performance Configurations](#performance-configurations) - - [AK/SK Configurations](#aksk-configurations) - - [Kubernetes Affinity Configurations](#kubernetes-affinity-configurations) - - [Mount Path Configurations](#mount-path-configurations) - - [Hybrid Deployment Configurations](#hybrid-deployment-configurations) - - [Kubernetes Precision Control Configurations](#kubernetes-precision-control-configurations) - - - -[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source_en.svg)](https://gitee.com/openeuler/yuanrong-datasystem/blob/master/docs/source_en/appendix/k8s_configuration.md) - -This document describes openYuanrong datasystem Kubernetes configuration items. - -## Minimal Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| [global.imageRegistry](#image-configurations) | string | `""` | image registry url | -| [global.images.datasystem](#image-configurations) | string | `"yr_datasystem:v0.1"` | image name and image tag | -| [global.etcd.etcdAddress](#etcd-configurations) | string | `""` | ETCD endpoints,openYuanrong datasystem cluster management relies on ETCD | - -**Example**: -```yaml -global: - # image:swr.cn-south-1.myhuaweicloud.com/openeuler/openyuanrong_datasystem:0.5.0 - imageRegistry: "swr.cn-south-1.myhuaweicloud.com/openeuler" - - images: - datasystem: "openyuanrong_datasystem:0.5.0" - - etcd: - etcdAddress: "127.0.0.1:2379" -``` - -To deploy openYuanrong datasystem, refer to: [openYuanrong datasystem Kubernetes Deployment](../getting-started/deploy.md#openYuanrong-datasystem-kubernetes部署). - -Each openYuanrong datasystem DaemonSet can use a maximum of 2GB shared memory space for data caching by default. If you need to adjust this value, you can configure it via [global.resources.datasystemWorker.sharedMemory](#resource-configurations). - -> **Notes:** -> -> The size of [global.resources.datasystemWorker.sharedMemory](#resource-configurations) must be less than [global.resources.requests.memory](#resource-configurations). - -```yaml -global: - # swr.cn-south-1.myhuaweicloud.com/openeuler/openyuanrong_datasystem:0.5.0 - imageRegistry: "swr.cn-south-1.myhuaweicloud.com/openeuler" - - images: - datasystem: "openyuanrong_datasystem:0.5.0" - - etcd: - etcdAddress: "127.0.0.1:2379" - - resources: - datasystemWorker: - limits: - cpu: "3" - # Limit - memory: "5Gi" - requests: - cpu: "3" - # Request memory must greater than shreadMemory - memory: "5Gi" - # Set the shared memory limit to 4GB - sharedMemory: 4096 -``` - -> **Important Notes:** -> -> - openYuanrong datasystem relies on ETCD for cluster management. Ensure the ETCD service is available before deployment. -> - openYuanrong datasystem uses port `31501` by default. Ensure this port is available on all Kubernetes nodes, or specify a custom port via [global.port.datasystemWorker](#ipcrpc-configurations). -> - Ensure each node in the Kubernetes cluster has at least 3 CPU cores and 4GB memory available, or reduce default resource requirements via [Resource Configurations](#resource-configurations). -> - openYuanrong datasystem Pod containers mount the following host directories by default. Ensure the container runtime user has read-write-execute (rwx) permissions for these directories: -> | Host Path | Configuration | Function | -> |-----------|--------|------| -> | /home/sn/datasystem/logs | [global.log.logDir](#log-configurations) | Log persistence directory | -> | /home/uds | [global.ipc.udsDir](#ipcrpc-configurations) | Unix Domain Socket file path for establishing shared memory mapping between datasystem_worker and client | -> | /home/sn/datasystem/rocksdb | [global.metadata.rocksdbStoreDir](#metadata-configurations) | Metadata persistence directory | -> | /dev/shm | - | Shared memory directory | - -## Detailed Configurations - -### Image Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.imageRegistry | string | `""` | Image prefix. Docker registry URL. Empty means using Docker Hub | -| global.images.datasystem | string | `"yr_datasystem:v0.1"` | Image name and tag in 'name:tag' format | - -**Example**: -```yaml -global: - # image:swr.cn-south-1.myhuaweicloud.com/openeuler/openyuanrong_datasystem:0.5.0 - imageRegistry: "swr.cn-south-1.myhuaweicloud.com/openeuler" - images: - datasystem: "openyuanrong_datasystem:0.5.0" -``` - -### Namespace Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.namespace | string | `"default"` | datasystem-worker Pod namespace in Kubernetes | -| global.autoCreatedNamespace | bool | `false` | If the namespace is not "default" or does not exist, set this configuration to true to enable automatic creation | - -### Resource Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.resources.datasystemWorker.limits.cpu | string | `"3"` | Maximum CPU cores occupied by a openYuanrong datasystem DaemonSet | -| global.resources.datasystemWorker.limits.memory | string | `"4Gi"` | Maximum memory occupied by a openYuanrong datasystem DaemonSet | -| global.resources.datasystemWorker.requests.cpu | string | `"3"` | CPU cores required for initializing a single openYuanrong datasystem DaemonSet. The value must be less than or equal to `global.resources.datasystemWorker.limits.cpu` | -| global.resources.datasystemWorker.requests.memory | string | `"4Gi"` | Memory required for initializing a single openYuanrong datasystem DaemonSet. The value must be less than or equal to `global.resources.datasystemWorker.limits.memory` | -| global.resources.datasystemWorker.maxClientNum | int | `200` | Maximum number of clients that can be connected to a worker | -| global.resources.datasystemWorker.sharedMemory | int | `2048` | Upper limit of the shared memory, the default unit for shared memory is MB. The value must be less than `global.resources.datasystemWorker.requests.memory` | - -### IPC/RPC Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.ipc.ipcThroughSharedMemory | bool | `true` | Determines whether the shared memory feature is enabled | -| global.ipc.udsDir | string | `"/home/uds"` | Unix domain socket (UDS) file directory with 80-character path limit | -| global.port.datasystemWorker | int | `31501` | Port value (suggested range: 30000-32767) | -| global.rpc.enableCurveZmq | bool | `false` | Whether to enable the authentication function between datasystem_worker | -| global.rpc.curveKeyDir | string | `"/home/sn/datasystem/curve_key_dir"` | The directory to find ZMQ curve key files. This path must be specified when zmq authentication is enabled | -| global.rpc.curveZmqKey.clientPublicKey | string | `""` | Client's public key in the curve encryption environment | -| global.rpc.curveZmqKey.workerPublicKey | string | `""` | Datasystem-worker's public key in the curve encryption environment | -| global.rpc.curveZmqKey.workerSecretKey | string | `""` | Datasystem-worker's private key in the curve encryption environment | -| global.rpc.ocWorkerWorkerDirectPort | int | `0` | A direct TCP/IP port for worker-to-worker scenarios to improve latency. Acceptable value:0, or some positive integer. 0 means disabled | -| global.rpc.ocWorkerWorkerPoolSize | int | `3` | Number of parallel connections from worker to worker scenarios to improve throughput. `ocWorkerWorkerDirectPort` must be enabled to take effect | -| global.rpc.payloadNocopyThreshold | string | `"104857600"` | Minimum payload size in bytes to trigger direct write into shared memory. May incur extra network cost | -| global.rpc.rpcThreadNum | int | `128` | Config rpc server thread number, must be greater than 0 | -| global.rpc.ocThreadNum | int | `64` | The number of worker service for object cache | -| global.rpc.zmqServerIoContext | int | `5` | Optimize the performance of the customer. Default server is 5. The higher the throughput, the higher the value, but should be in range [1, 32] | -| global.rpc.zmqClientIoContext | int | `5` | Optimize the performance of the client stub. Default value is 5. The higher the throughput, the higher the value, but should be in range [1, 32] | -| global.rpc.zmqChunkSz | int | `1048576` | Parallel payload split chunk size. Default to 1048756 bytes | -| global.rpc.maxRpcSessionNum | int | `2048` | Maximum number of sessions that can be cached, must be within [512, 10'000] | - -**Example**: - -Configure a Unix Domain Socket path as "/home/uds" and use port 31501 as the listening port for the openYuanrong datasystem DaemonSet. - -```yaml -global: - port: - datasystemWorker: 31501 - - ipc: - ipcThroughSharedMemory: true - udsDir: /home/uds -``` - -### ETCD Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.etcd.etcdAddress | string | `""` | Configure ETCD server address. Should not be empty | -| global.etcd.enableEtcdAuth | bool | `false` | Whether to enable ETCD auth | -| global.etcd.etcdCa | string | `""` | The CA certificate. No encryption required. Base64 encoding is required | -| global.etcd.etcdCert | string | `""` | The client cert. No encryption required, base64 transcoding required | -| global.etcd.etcdKey | string | `""` | The client private key. Base64 transcoding is required, and whether encryption is required depends on whether passphrase is applied | -| global.etcd.etcdCertDir | string | `"/home/sn/datasystem/etcd_cert_dir"` | The path where the encrypted etcd certificate is mounted. This must be specified when etcd authentication is enabled | -| global.etcd.passphraseValue | string | `""` | The value of passphrase. Encryption is required, base64 transcoding required | -| global.etcd.etcdMetaPoolSize | int | `8` | ETCD metadata async operation pool size. If key size is large under WRITE_BACK_L2_CACHE mode, you may need to increase this value | -| global.etcd.etcdTargetNameOverride | string | `""` | Set ETCD target name override for SSL host name checking. The configuration value should be consistent with the DNS content of the Subject Alternate Names of the TLS certificate | - -**Example**: - -```yaml -global: - # Connect to an ETCD service without auth. - etcd: - etcdAddress: "127.0.0.1:2379" - enableEtcdAuth: false - etcdTargetNameOverride: "" - etcdCa: "" - etcdCert: "" - etcdKey: "" - etcdCertDir: "" - passphraseValue: "" - etcdMetaPoolSize: 8 -``` - -### Spill Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.spill.spillDirectory | string | `""` | The path of the spilling, empty means local_dick spill disabled. It will create a new subdirectory("datasystem_spill_data") under the `spillDirectory` to store the spill file | -| global.spill.spillSizeLimit | string | `"0"` | Maximum amount of spilled data that can be stored in the spill directory. If spill is enable and spillSizeLimit is 0, spillSizeLimit will be set to 95% of the spill directory. Unit for spillSizeLimit is Bytes | -| global.spill.spillThreadNum | int | `8` | It represents the maximum parallelism of writing files, more threads will consume more CPU and I/O resources | -| global.spill.spillFileMaxSizeMb | int | `200` | The size limit of single spill file, spilling objects which lager than that value with one object per file. If there are some big objects, you can increase this value to avoid run out of inodes quickly. The valid range is 200-10240. | -| global.spill.spillFileOpenLimit | int | `512` | The maximum number of open file descriptors about spill. If opened file exceed this value, some files will be temporarily closed to prevent exceeding the maximum system limit. You need reduce this value if your system resources are limited. The valid range is greater than or equal to 8. | -| global.spill.spillEnableReadahead | bool | `true` | Disable readahead can mitigate the read amplification problem for offset read, default is true | -| global.spill.evictionThreadNum | int | `1` | Thread number of eviction for object cache | - -- **Example1**: - - Spill directory is "/opt/spill/yr_datasystem_spill",the maximum size is 10GB. - - ```yaml - global: - spill: - spillDirectory: "/opt/spill/yr_datasystem_spill" - spillSizeLimit: "10737418240" - spillThreadNum: 8 - spillFileMaxSizeMb: 200 - spillFileOpenLimit: 512 - spillEnableReadahead: true - evictionThreadNum: 1 - ``` - -- **Example2**: - - The spill directory is "/opt/spill/yr_datasystem_spill". To enhance spill performance, mount the host machine's SSD (assumed path: "/data/ssd") with 10GB capacity. This scenario requires coordination with [Mount Path Configurations](#mount-path-configurations). - - ```yaml - global: - spill: - spillDirectory: "/opt/spill/yr_datasystem_spill" - spillSizeLimit: "10737418240" - spillThreadNum: 8 - spillFileMaxSizeMb: 200 - spillFileOpenLimit: 512 - spillEnableReadahead: true - evictionThreadNum: 1 - - mount: - # SSD path in host. - - hostPath: "/data/ssd/yr_datasystem_spill" - # The mounted directory inside the container must match the `spillDirectory`. - mountPath: "/opt/spill/yr_datasystem_spill" - ``` - -### Log Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.log.logDir | string | `"/home/sn/datasystem/logs"` | The directory where log files are stored | -| global.log.logLevel | int | `0` | Vlog level, a larger value indicates more detailed logs. The value is between 0-3 | -| global.log.logAsync | bool | `true` | Flush log files with async mode | -| global.log.logAsyncQueueSize | int | `65536` | Size of async logger's message queue | -| global.log.logBufSecs | int | `10` | Buffer log messages for at most this many seconds | -| global.log.logCompress | bool | `true` | Compress old log files in .gz format. This parameter takes effect only when the size of the generated log is greater than max log size | -| global.log.logFilename | string | `""` | Prefix of log filename, default is program invocation short name. Use standard characters only | -| global.log.logRetentionDay | int | `0` | If log-retention-day is greater than 0, any log file from your project whose last modified time is greater than log-retention-day days will be unlinked. If log-retention-day is equal 0, will not unlink log file by time | -| global.log.maxLogFileNum | int | `25` | Maximum number of log files to retain per severity level. And every log file size is limited by max log size | -| global.log.maxLogSize | int | `400` | The maximum log file size (in MB), which must be greater than 0 | -| global.observability.logMonitor | bool | `true` | Record performance and resource logs | -| global.observability.logMonitorExporter | string | `"harddisk"` | Specify the type of exporter, [harddisk]. Takes effect only when logMonitor is true | -| global.observability.logMonitorIntervalMs | int | `10000` | The sleep time between iterations of observability collector scan | -| global.log.minLogLevel | int | `0` | Log messages below this level will not actually be recorded anywhere | - -```yaml -global: - # Log path is '/home/sn/datasystem/yr_datasystem/logs' and log name prefix is 'yr_datasystem' - log: - logDir: /home/sn/datasystem/yr_datasystem/logs - logAsyncQueueSize: 65536 - logLevel: 0 - maxLogSize: 400 - maxLogFileNum: 25 - logRetentionDay: 0 - logAsync: true - logBufSecs: 10 - # Enable log compress - logCompress: true - # Log filename prefix - logFilename: "yr_datasystem" -``` - -### L2 cache Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.l2Cache.l2CacheType | string | `"none"` | Config the l2 cache type support obs, none by default. Optional value: 'obs', 'sfs', 'none' | -| global.l2Cache.l2CacheDeleteThreadNum | int | `32` | l2 cache delete threads number, it affects the parallelism of L2 data deletion. Increasing it will also cause CPU usage to increase | - -::::{tab-set} - -:::{tab-item} OBS - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.l2Cache.obs.obsAccessKey | string | `""` | The access key for obs AK/SK authentication | -| global.l2Cache.obs.obsSecretKey | string | `""` | The secret key for obs AK/SK authentication | -| global.l2Cache.obs.obsEndpoint | string | `""` | OBS endpoint. Example: "xxx.hwcloudtest.cn" | -| global.l2Cache.obs.obsBucket | string | `""` | OBS bucket name | -| global.l2Cache.obs.obsHttpsEnabled | bool | `false` | Whether to enable the https in obs. false: use HTTP (default), true: use HTTPS | -| global.l2Cache.obs.cloudServiceTokenRotation.enable | bool | `false` | Whether to use ccms credential rotation mode to access OBS, default is false. If it is enabled, need to specify `iamHostName`, `identityProvider`, `projectId`, `regionId` at least. In addition, obsEndpoint and obsBucket need to be specified | -| global.l2Cache.obs.cloudServiceTokenRotation.iamHostName | string | `""` | Domain name of the IAM token to be obtained. Example: iam.example.com | -| global.l2Cache.obs.cloudServiceTokenRotation.identityProvider | string | `""` | Provider that provides permissions for the ds-worker. Example: csms-datasystem | -| global.l2Cache.obs.cloudServiceTokenRotation.projectId | string | `""` | Project id of the OBS to be accessed. Example: fb6a00ff7ae54a5fbb8ff855d0841d00 | -| global.l2Cache.obs.cloudServiceTokenRotation.regionId | string | `""` | Region id of the OBS to be accessed. Example: cn-beijing-4 | -| global.l2Cache.obs.cloudServiceTokenRotation.enableTokenByAgency | bool | `false` | Whether to access OBS of other accounts by agency, default is false. If is true, need to specify `tokenAgencyName` and `tokenAgencyDomain` | -| global.l2Cache.obs.cloudServiceTokenRotation.tokenAgencyDomain | string | `""` | Agency name for proxy access to other accounts. Example: obs_access | -| global.l2Cache.obs.cloudServiceTokenRotation.tokenAgencyName | string | `""` | Agency domain for proxy access to other accounts. Example: op_svc_cff | - -::: - -:::{tab-item} SFS - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.l2Cache.sfsTurbo.endpoint | string | `""` | Endpoint of sfs-turbo, which is used to concatenate the shared path in sfs-turbo | -| global.l2Cache.sfsTurbo.subPath | string | `""` | Sfs-turbo sub-path mounted to ds-worker. If this parameter is not specified, the root directory '/' of sfs-turbo is mounted by default | -| global.l2Cache.sfsTurbo.id | string | `"0"` | Specifies the sfs-turbo ID, which can be viewed on the sfs-turbo page | -| global.l2Cache.sfsTurbo.projectId | string | `"0"` | Specifies the sfs-turbo enterprise project ID, which can be viewed on the sfs-turbo page | -| global.l2Cache.sfsTurbo.capacity | string | `"500Gi"` | Specifies the capacity of using sfs-turbo. Note that the size must be smaller than the size of sfs-turbo | - -::: - -:::: - -### AZ Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.azName | string | `"AZ1"` | Available Zone name | -| global.crossAz.otherAzNames | string | `""` | Specify other az names using the same etcd. Only split by ',' | -| global.crossAz.crossAzGetDataFromWorker | bool | `true` | Control whether to try to get data from other AZ's worker first. If false, data will be retrieved directly from the L2 cache | -| global.crossAz.crossAzGetMetaFromWorker | bool | `false` | Control whether to get meta data from other AZ's worker, if false then get meta data from local AZ | - -**Example**: -```yaml -global: - azName: "az1" - - crossAz: - otherAzNames: "az2,az3,az4" - crossAzGetDataFromWorker: true - crossAzGetMetaFromWorker: false -``` - -### Metadata Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.metadata.enableMetaReplica | bool | `false` | Controls whether to enable multiple meta replica | -| global.metadata.rocksdbStoreDir | string | `"/home/sn/datasystem/rocksdb"` | Config MASTER back store directory and must specify in rocksdb scenario. The rocksdb database is used to persistently store the metadata stored in the master so that the metadata before the restart can be re-obtained when the master restarts | -| global.metadata.rocksdbBackgroundThreads | int | `16` | Number of background threads rocksdb can use for flushing and compacting | -| global.metadata.rocksdbMaxOpenFile | int | `128` | Number of open files that can be used by the rocksdb | - -### Reliability Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.reliability.clientReconnectWaitS | int | `5` | Client reconnect wait seconds | -| global.reliability.clientDeadTimeoutS | int | `120` | Maximum time interval for the worker to determine client death, value range: [15, UINT64_MAX) | -| global.reliability.heartbeatIntervalMs | int | `1000` | Time interval between worker and etcd heartbeats | -| global.reliability.nodeTimeoutS | int | `60` | Maximum time interval before a node is considered lost, the unit is second. (Must be greater than 5s) | -| global.reliability.nodeDeadTimeoutS | int | `300` | Maximum time interval for the etcd to determine node death, the unit is second. (Must be greater than nodeTimeoutS) | -| global.reliability.enableReconciliation | bool | `true` | Control whether to enable reconciliation | -| global.reliability.enableHashRingSelfHealing | bool | `false` | Whether to support self-healing when the hash ring is in an abnormal state | -| global.reliability.livenessProbeTimeoutS | int | `150` | Timeout interval of kubernetes liveness probe | -| global.reliability.addNodeWaitTimeS | int | `60` | Time to wait for the first node that wants to join a working hash ring | -| global.reliability.autoDelDeadNode | bool | `true` | Indicate dead nodes marked in the hash ring can be removed or not | - -### Graceful Shutdown Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.gracefulShutdown.scaleInTaint | string | `"datasystem/offline=true:NoExecute"` | Scale in taint, format is `key=value:effect` | -| global.gracefulShutdown.enableLosslessDataExitMode | bool | `false` | Decide whether to migrate data to other nodes or not when current node exits. If this is the only node in the cluster, exits directly and the data will be lost | -| global.gracefulShutdown.checkAsyncQueueEmptyTimeS | int | `15` | The worker ensures a certain period of time that the asynchronous queues for sending messages to ETCD and L2 cache remain empty before it can exit properly | -| global.gracefulShutdown.dataMigrateRateLimitMb | int | `40` | Data migration rate limit for every node when scaling down | -| global.gracefulShutdown.livenessProbeTerminationGracePeriodSeconds | int | `0` | Overwrite the global default terminationGracePeriodSeconds when liveness probe failed, enable when greater than 0 | - -### Performance Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.performance.enableHugeTlb | bool | `false` | This is controlled by the flag of mmap(MAP_HUGETLB) which can improve memory access and reducing the overhead of page table | -| global.performance.enableFallocate | bool | `true` | Due to Kubernetes' (k8s) resource calculation policies, shared memory is sometimes counted twice, which can lead to client crashes. To address this issue, fallocate is employed to link the client and worker nodes for shared memory, thus correcting the memory calculation errors. By default, fallocate is enabled. Enabling fallocate will lower the efficiency of memory allocation | -| global.performance.sharedMemoryPopulate | bool | `false` | Avoiding page faults during copying improves runtime performance but may result in longer worker startup times (depending on sharedMemory). If set to true, it must be ensured that 'arenaPerTenant' is 1 and 'enableFallocate' is false | -| global.performance.enableThp | bool | `false` | Control this process by enabling transparent huge pages, default is disabled. Enabling Transparent Huge Pages (THP) can enhance performance and reduce page table overhead, but it may also lead to increased memory usage, leading to worker being terminated by the OOM Killer | -| global.performance.arenaPerTenant | int | `16` | The arena count for each tenant. Multiple arenas can improve the performance of share memory allocation for the first time, but each arena will use one more fd, value range: [1, 32] | -| global.performance.memoryReclamationTimeSecond | int | `600` | The memory reclamation time after free | -| global.performance.asyncDelete | bool | `false` | Set whether to delete object asynchronously. If set to true, master will notify workers to delete objects asynchronously. Client doesn't need to wait for all workers to delete objects. | - -### AK/SK Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.akSk.systemAccessKey | string | `""` | The access key used by the system | -| global.akSk.systemSecretKey | string | `""` | The secret key used by the system | -| global.akSk.tenantAccessKey | string | `""` | The access key used by the tenant | -| global.akSk.tenantSecretKey | string | `""` | The secret key used by the tenant | -| global.akSk.requestExpireTimeS | int | `300` | Request expiration time in seconds, the maximum value is 300s | - -### Kubernetes Affinity Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.affinity.nodeSelector | object | `{}` | Affinity configuration, which is used to control pod scheduling to nodes that meet specific conditions | -| global.affinity.nodeAffinity | object | `{}` | Affinity configuration are used to accurately control pod scheduling to nodes that meet specific conditions. Compared with nodeSelector, more powerful advanced scheduling policies are supported. | -| global.affinity.tolerations | list | `[]` | Taint tolerance. Pods are passively rejected by nodes and will not be expelled | - -### Mount Path Configurations - -The mount path configuration is typically used in conjunction with the [Spill Configurations](#spill-configurations) - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.mount.hostPath | string | `""` | host path | -| global.mount.mountPath | string | `""` | mount path in container | - -**Example**: -```yaml -global: - mount: - # Spill mount path 1 - - hostPath: "/data/ssd1/yr_datasystem_spill" - mountPath: "/opt/spill/yr_datasystem_spill1" - # Spill mount path 2 - - hostPath: "/data/ssd2/yr_datasystem_spill" - mountPath: "/opt/spill/yr_datasystem_spill2" -``` - -### Hybrid Deployment Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.multiSpec | list | `[]` | Support hybrid deployment. | - -**Example**: -```yaml -global: - # ... - multiSpec: - # Deploy Pods of the first specification on nodes with the affinity label `mid` - - name: "ds-worker-mid" - affinityLabel: "mid" - resources: - limits: - cpu: "3" - memory: "4Gi" - requests: - cpu: "3" - memory: "4Gi" - workerResources: - sharedMemory: 1024 - # Deploy Pods of the second specification on nodes with the affinity label `small` - - name: "ds-worker-small" - affinityLabel: "small" - resources: - limits: - cpu: "2" - memory: "3Gi" - requests: - cpu: "1" - memory: "2Gi" - workerResources: - sharedMemory: 1024 - # Deploy Pods of the third specification on nodes with the affinity label `big` - - name: "ds-worker-big" - affinityLabel: "big" - resources: - limits: - cpu: "5" - memory: "6Gi" - requests: - cpu: "4" - memory: "5Gi" - workerResources: - sharedMemory: 2048 -``` - -### Kubernetes Precision Control Configurations - -| Configuration | Type | Default | Description | -|-----|------|---------|-------------| -| global.annotations | object | `{}` | Kubernetes meta annotation | -| global.enableNonPreemptive | bool | `false` | Configure priorityClass. If the value is false, the default priorityClass is system-cluster-critical. If the value is true, a priorityClass with preemptionPolicy Never is created. | -| global.fsGid | string | `"1002"` | fsGroup configuratio. All processes of the container are also part of the supplementary group ID | diff --git a/docs/source_en/conf.py b/docs/source_en/conf.py deleted file mode 100644 index 30236a14187caba80f48938646cdcda90a195289..0000000000000000000000000000000000000000 --- a/docs/source_en/conf.py +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import shutil -import sys - -import datasystem - -# Print debug information -print(f"Python path: {sys.path}") -print(f"datasystem exists: {datasystem.__path__}") - -# ---- common -yr_datasystem_root = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) -yr_datasystem_build_dir = os.path.join(os.path.dirname(__file__), "build") -if os.path.exists(yr_datasystem_build_dir): - if os.path.isdir(yr_datasystem_build_dir): - shutil.rmtree(yr_datasystem_build_dir) - else: - os.remove(yr_datasystem_build_dir) - -# ---- process header files -yr_datasystem_include_dir = os.path.join(yr_datasystem_root, "include") -tmp_include_dir = os.path.join(yr_datasystem_build_dir, "include") - -shutil.copytree(yr_datasystem_include_dir, tmp_include_dir) - -fileList = [] -for root, _, files in os.walk(tmp_include_dir): - for fileObj in files: - fileList.append(os.path.join(root, fileObj)) - -for file_name in fileList: - with open(file_name, 'r') as file: - content = file.read() # Read the file content - - # Replace the target string with an empty string - updated_content = content.replace('__attribute((visibility("default"))) ', '') - - # Open the file for writing and write the modified content back - with open(file_name, 'w') as file: - file.write(updated_content) - -# ---- Project Information ---- -project = 'openYuanrong datasystem' -copyright = 'openYuanrong datasystem' -author = 'openYuanrong datasystem' -release = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -myst_enable_extensions = ["dollarmath", "amsmath", "colon_fence"] - -# ---- Extension Configuration ---- -extensions = [ - 'breathe', - 'exhale', - 'sphinx.ext.autodoc', # Core autodoc generation - 'sphinx.ext.autosummary', # Auto summary generation - 'sphinx.ext.viewcode', # Add source code links - 'sphinx.ext.napoleon', # Support Google-style docs - 'myst_parser', - 'sphinx_design' -] - -# Autosummary configuration -autosummary_generate = True # Auto-generate summary files -autosummary_imported_members = True # Include imported members -autosummary_ignore_module_all = False - -# Autodoc configuration -autodoc_default_options = { - 'members': True, - 'undoc-members': True, - 'show-inheritance': True -} -autoclass_content = 'both' # Include both class and __init__ docs - -# ---- Template Configuration ---- -templates_path = [os.path.realpath('_templates')] - -# ---- File Configuration ---- -source_suffix = { - '.rst': 'restructuredtext', - '.md': 'markdown', -} -master_doc = 'index' -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - -# Setup the breathe extension -breathe_projects = { - "MyProject": os.path.join(yr_datasystem_build_dir, "doxyoutput", "xml") -} - -breathe_default_project = "MyProject" - -exhale_args = { - 'containmentFolder': os.path.join(yr_datasystem_build_dir, 'generate'), # API 文档生成的目录 - 'rootFileName': 'index.rst', # 根文件名 - 'rootFileTitle': 'C++ API Documentation', # 根文件标题 - 'doxygenStripFromPath': '../', # 去除 Doxygen 路径 - 'exhaleExecutesDoxygen': True, # 自动执行 Doxygen - 'exhaleDoxygenStdin': f''' - INPUT = {tmp_include_dir} - PROJECT_NAME = MyProject - GENERATE_XML = YES - EXTRACT_ALL = NO - ''' -} - -# ---- HTML Output Configuration ---- -html_theme = 'sphinx_rtd_theme' -html_static_path = ['_static'] - -# ---- Debug Functions ---- -def setup(app): - # Print all processed objects - def log_autodoc(app, what, name, obj, options, lines): - print(f"[AUTODOC] Processing {what}: {name}") - app.connect('autodoc-process-docstring', log_autodoc) - - # Verify DsClient can be imported - try: - from datasystem import DsClient - print(f"✅ Successfully imported DsClient from {DsClient.__module__}") - except ImportError as e: - print(f"❌ Failed to import DsClient: {e}") - -# ---- Advanced Configuration ---- -# Use mock for dependency resolution if needed -autodoc_mock_imports = [] - -# Preserve original formatting in docstrings -autodoc_preserve_defaults = True \ No newline at end of file diff --git a/docs/source_en/getting-started/image/deployment.png b/docs/source_en/getting-started/image/deployment.png deleted file mode 100644 index 30a78704b86ad0a84ce5d9b21cb3b114f22d9bc9..0000000000000000000000000000000000000000 Binary files a/docs/source_en/getting-started/image/deployment.png and /dev/null differ diff --git a/docs/source_en/getting-started/image/logical_architecture.png b/docs/source_en/getting-started/image/logical_architecture.png deleted file mode 100644 index 724e6393aadb2611d02960b4dc4719ae1f78c3cd..0000000000000000000000000000000000000000 Binary files a/docs/source_en/getting-started/image/logical_architecture.png and /dev/null differ diff --git a/docs/source_en/index.rst b/docs/source_en/index.rst deleted file mode 100644 index 03fd4388152308e772ab019df12a35b0c50d347c..0000000000000000000000000000000000000000 --- a/docs/source_en/index.rst +++ /dev/null @@ -1,68 +0,0 @@ -openYuanrong datasystem Documentation -===================================== - -Python API --------- - -.. autosummary:: - :toctree: generated - :caption: Python API - :nosignatures: - :template: classtemplate.rst - - datasystem.DsClient - datasystem.hetero_client.HeteroClient - datasystem.hetero_client.Future - datasystem.hetero_client.DeviceBlobList - datasystem.hetero_client.Blob - datasystem.kv_client.KVClient - datasystem.kv_client.ReadOnlyBuffer - datasystem.kv_client.ReadParam - datasystem.object_client.ObjectClient - datasystem.object_client.Buffer - datasystem.object_client.ConsistencyType - datasystem.object_client.WriteMode - -C++ API --------- - -- :doc:`build/generate/classdatasystem_1_1DsClient` -- :doc:`build/generate/classdatasystem_1_1HeteroClient` -- :doc:`build/generate/classdatasystem_1_1Future` -- :doc:`build/generate/structdatasystem_1_1DeviceBlobList` -- :doc:`build/generate/structdatasystem_1_1Blob` -- :doc:`build/generate/classdatasystem_1_1KVClient` -- :doc:`build/generate/classdatasystem_1_1ReadOnlyBuffer` -- :doc:`build/generate/structdatasystem_1_1ReadParam` -- :doc:`build/generate/classdatasystem_1_1ObjectClient` -- :doc:`build/generate/classdatasystem_1_1Buffer` -- :doc:`build/generate/enum_namespacedatasystem_1adf069347bff2a65586687e1bce7e58a2` -- :doc:`build/generate/enum_namespacedatasystem_1ae9da35157a96d4b7af8a792ed0f9d0d7` - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: C++ API - :hidden: - - build/generate/classdatasystem_1_1DsClient - build/generate/classdatasystem_1_1HeteroClient - build/generate/classdatasystem_1_1Future - build/generate/structdatasystem_1_1DeviceBlobList - build/generate/structdatasystem_1_1Blob - build/generate/classdatasystem_1_1KVClient - build/generate/classdatasystem_1_1ReadOnlyBuffer - build/generate/structdatasystem_1_1ReadParam - build/generate/classdatasystem_1_1ObjectClient - build/generate/classdatasystem_1_1Buffer - build/generate/enum_namespacedatasystem_1adf069347bff2a65586687e1bce7e58a2 - build/generate/enum_namespacedatasystem_1ae9da35157a96d4b7af8a792ed0f9d0d7 - - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: Appendix - :hidden: - - appendix/k8s_configuration diff --git a/docs/source_zh_cn/api/api_cpp/common.md b/docs/source_zh_cn/api/api_cpp/common.md deleted file mode 100644 index 17e8f028358f51d9a0604bd47ef1fa263779d848..0000000000000000000000000000000000000000 --- a/docs/source_zh_cn/api/api_cpp/common.md +++ /dev/null @@ -1,356 +0,0 @@ -# Common - -[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.5.0/resource/_static/logo_source.svg)](../../../../include/datasystem/utils) - -## 接口汇总 - -| 类名 | 说明 | -| --- | --- | -| [Context](#context) | 保存执行中的上下文配置。| -| [ConnectOptions](#connectoptions) | 配置对象客户端的初始化参数类。| -| [Optional](#optional) | 可将任意类型视为 null 的类。| -| [Status](#status) | 返回状态类。| -| [StringView](#stringview) | 免拷贝字符串类。| - -## Context - -\#include <[datasystem/context/context.h](../../../../include/datasystem/context/context.h)> - -Context 类用于保存执行中的上下文配置。 - -### 构造函数和析构函数 - -```cpp -Context() -~Context() = default; -``` - -### 公有成员函数 - -| 函数 | 说明 | -|-------------------------------------------------------------------------------|--------| -| [`static Status SetTraceId(const std::string &traceId)`](#settraceid) | 设置 traceID,可用于请求链路跟踪。 | -| [`static void SetTenantId(const std::string &tenantId)`](#settenantid) | 设置运行时的租户 ID。 | - -#### SetTraceId - -```cpp -static Status SetTraceId(const std::string &traceId) -``` - -设置 traceID,可用于请求链路跟踪。 - -- 参数 - - - `traceId`: 用户描述跟踪链路 ID。 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示设置成功,否则返回其他错误码。 - -#### SetTenantId - -```cpp -static void SetTenantId(const std::string &tenantId) -``` - -设置运行时的租户 ID。 - -- 参数 - - - `tenantId`: 运行时的租户 ID。 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示设置成功,否则返回其他错误码。 - -## ConnectOptions - -\#include <[datasystem/utils/connection.h](../../../../include/datasystem/utils/connection.h)> - -ConnectOptions 类用于配置对象客户端的初始化参数。 - -```cpp -struct ConnectOptions { - std::string host; - int32_t port; - int32_t connectTimeoutMs = 60 * 1000; // 60s - std::string clientPublicKey = ""; - SensitiveValue clientPrivateKey = ""; - std::string serverPublicKey = ""; - std::string accessKey = ""; - SensitiveValue secretKey = ""; - std::string tenantId = ""; - bool enableCrossNodeConnection = false; -} -``` - -参数具体说明如下: -|参数| 说明 | -|----|--------------------------------------| -|host | 数据系统 Worker 的主机 IP 地址。 | -|port | 数据系统 Worker 的主机 IP 端口号。 | -|connectTimeoutMs | 客户端连接和请求超时时间,单位为毫秒。默认值:60'000 | -|clientPublicKey | 用于 curve 认证的客户端公钥。默认值:"" | -|clientPrivateKey | 用于 curve 认证的客户端私钥。默认值:"" | -|serverPublicKey | 用于 curve 认证的服务端公钥。默认值:"" | -|accessKey | AK/SK 授权使用的访问密钥。默认值:"" | -|secretKey | AK/SK 授权的密钥。默认值:"" | -|tenantId | 租户 ID。默认值:"" | -|enableCrossNodeConnection | 如果为 `true`,允许客户端在与当前数据系统Worker 连接异常时自动切换到备用节点。默认值:`false` | - -## Optional - -\#include <[datasystem/object_cache/utils/optional.h](../../../../include/datasystem/utils/optional.h)> - -用于表示一个值可能存在,当值不存在时表示为 null。在 [Get](./object_cache.md#get) 接口的传出参数通过 `Optional` 表示对象是否获取成功。 - -### 构造函数和析构函数 - -```cpp -constexpr Optional() -Optional(const Optional &) -Optional &operator=(const Optional &) -Optional(Optional &&other) noexcept -Optional &operator=(Optional &&) noexcept -template explicit Optional(Args &&... args); -~Optional() -``` - -## Status - -\#include <[datasystem/object_cache/utils/status.h](../../../../include/datasystem/utils/status.h)> - -Status 类用于表示请求/方法的执行结果。 - -### 构造函数和析构函数 - -```cpp -Status() noexcept -Status(const Status &other) -Status(Status &&other) noexcept -Status(StatusCode code, std::string msg) -Status(StatusCode code, int lineOfCode, const std::string &fileName, const std::string &extra = "") -~Status() noexcept -``` - -### 公有成员函数 - -| 函数 | 说明 | -|-------------------------------------------------------------------------------|--------| -| [`static Status OK()`](#ok) | 返回状态码为 `K_OK` 的 Status。 | -| [`std::string ToString() const`](#tostring) | 返回 Status 的状态码和报错信息。 | -| [`StatusCode GetCode() const`](#getcode) | 返回 Status 的状态码。 | -| [`std::string GetMsg() const`](#getmsg) | 返回 Status 的报错信息。 | -| [`void AppendMsg(const std::string &appendMsg)`](#appendmsg) | 拼接 Status 的报错信息。 | -| [`explicit operator bool() const`](#operator_bool) | 将 Status 对象自动转换为`bool`值 | -| [`bool operator==(const Status &other) const`](#operator_equal) | 重载 Status `==` 运算符 | -| [`bool operator!=(const Status &other) const`](#operator_not_equal) | 重载 Status `!=` 运算符 | -| [`bool IsOk() const`](#isok) | 判断 Status 的状态码是否为 `K_OK`。 | -| [`bool IsError() const`](#iserror) | 判断 Status 的状态码是否为非 `K_OK` 错误码。 | -| [`static std::string StatusCodeName(StatusCode code)`](#statuscodename) | 获取状态码的字符串表示,多用于打印需求。 | - -#### OK - -```cpp -static Status OK() -``` - -返回状态码为 `K_OK` 的 Status。 - -- 返回值 - - 状态码为 `K_OK` 的 Status。 - -#### ToString - -```cpp -std::string ToString() const -``` - -返回 Status 的状态码和报错信息。 - -- 返回值 - - Status 的状态码和报错信息。 - -#### GetCode - -```cpp -StatusCode GetCode() const -``` - -返回 Status 的状态码。 - -- 返回值 - - Status 的状态码。 - -#### GetMsg - -```cpp -std::string GetMsg() const -``` - -返回 Status 的报错信息。 - -- 返回值 - - Status 的报错信息。 - -#### AppendMsg - -```cpp -void AppendMsg(const std::string &appendMsg) -``` - -拼接 Status 的报错信息。 - -- 参数 - - - `appendMsg`: 需要拼接的报错信息。 - - -#### operator bool - -```cpp -explicit operator bool() const -``` - -将 Status 对象自动转换为`bool`值,在 if、while、for 或逻辑运算(&&、||、!)中,对象可以像 `bool` 一样被检查。 - -#### operator== - - -```cpp -bool operator==(const Status &other) const -``` - -重载 Status `==` 运算符,用于比较两个 Status 对象是否相等。 - -- 参数 - - - `other`: 待比较的 Status 对象。 - -- 返回值 - - `true`表示两个 Status 对象相等。 - -#### operator!= - - -```cpp -bool operator!=(const Status &other) const -``` - -重载 Status `!=` 运算符,用于比较两个 Status 对象是否不相等。 - -- 参数 - - - `other`: 待比较的 Status 对象。 - -- 返回值 - - `true`表示两个 Status 对象不相等。 - -#### IsOK - -```cpp -bool IsOk() const -``` - -判断 Status 的状态码是否为 `K_OK`。 - -- 返回值 - - `true`表示 Status 的状态码为 `K_OK`。 - -#### IsError - -```cpp -bool IsError() const -``` - -判断 Status 的状态码是否为非 `K_OK` 错误码。 - -- 返回值 - - `true`表示 Status 的状态码为非 `K_OK 错误码`。 - -#### StatusCodeName - -```cpp -static std::string StatusCodeName(StatusCode code) -``` - -获取状态码的字符串表示,多用于打印需求。 - -- 参数 - - - `code`: 状态码。 - -- 返回值 - - 状态码的字符串表示。 - - -## StringView - -\#include <[datasystem/object_cache/utils/string_view.h](../../../../include/datasystem/utils/string_view.h)> - -字符串视图类,主要用于高效地传递和访问字符串数据,而无需复制或分配内存。 - -### 构造函数和析构函数 - -```cpp -constexpr StringView() noexcept -constexpr StringView(const StringView &) noexcept -constexpr StringView(const char *str) -constexpr StringView(const char *str, size_t len) -StringView(const std::string &str) -constexpr StringView &operator=(const StringView &) noexcept -~StringView() -``` - -### 公有成员函数 -| 函数 | 说明 | -|-------------------------------------------------------------------------------|--------| -| [`constexpr const char *data() const noexcept`](#data) | 获取 StringView 的数据指针。 | -| [`constexpr size_t size() const noexcept`](#size) | 获取 StringView 的数据大小。 | -| [`constexpr bool empty() const noexcept`](#empty) | 判断 StringView 是否为空。 | - -#### data - -```cpp -constexpr const char *data() const noexcept -``` - -获取 StringView 的数据指针。 - -- 返回值 - - StringView 的数据指针。 - -#### size - -```cpp -constexpr size_t size() const noexcept -``` - -获取 StringView 的数据大小。 - -- 返回值 - - StringView 的数据大小。 - -#### empty - -```cpp -constexpr size_t empty() const noexcept -``` - -判断 StringView 是否为空。 - -- 返回值 - - `true` 表示 StringView 为空。 \ No newline at end of file diff --git a/docs/source_zh_cn/api/api_cpp/dsclient.md b/docs/source_zh_cn/api/api_cpp/dsclient.md deleted file mode 100644 index 8071069ee8a50dd80655070b97b13b43667e0fbb..0000000000000000000000000000000000000000 --- a/docs/source_zh_cn/api/api_cpp/dsclient.md +++ /dev/null @@ -1,85 +0,0 @@ -# DsClient - -[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.5.0/resource/_static/logo_source.svg)](../../../../include/datasystem/datasystem.h) - -## DsClient - -\#include <[datasystem/datasystem.h](../../../../include/datasystem/datasystem.h)> - -DsClient 为yuanrong-datasystem的客户端总入口,其中包含了异构对象、KV和object多类客户端。 - -### 构造函数和析构函数 - -```cpp -explicit DsClient(const ConnectOptions &connectOptions = {}) -~DsClient() -``` - -### 公有成员函数 -| 函数 | 说明 | -|------------------------------------|--------| -| [`Status Init()`](#init) | 初始化客户端。 | -| [`Status ShutDown()`](#shutdown) | 关闭客户端。 | -| [`std::shared_ptr KV()`](#kv) | 获取 KV 客户端。 | -| [`std::shared_ptr Hetero()`](#hetero) | 获取异构对象客户端。 | -| [`std::shared_ptr Object()`](#object) | 获取 object 客户端。 | - -#### Init - -```cpp -Status Init(); -``` - -初始化客户端,建立与数据系统 Worker 之间的连接。 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示初始化成功,否则返回其他错误码。 - -#### ShutDown - -```cpp -Status ShutDown(); -``` - -关闭客户端,断开与数据系统 Worker 之间的连接。 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示关闭成功,否则返回其他错误码。 - -#### KV - -```cpp -std::shared_ptr KV(); -``` - -获取 KV 客户端。 - -- 返回值 - - - std::shared_ptr\,返回 KVClient 客户端指针。 - -#### Hetero - -```cpp -std::shared_ptr Hetero(); -``` - -获取异构对象客户端。 - -- 返回值 - - - std::shared_ptr\,返回异构对象客户端指针。 - -#### Object - -```cpp -std::shared_ptr Object(); -``` - -获取 object 客户端。 - -- 返回值 - - - std::shared_ptr\,返回 object 客户端指针。 diff --git a/docs/source_zh_cn/api/api_cpp/hetero_cache.md b/docs/source_zh_cn/api/api_cpp/hetero_cache.md deleted file mode 100644 index 5d66b62941c4bf2e144fa37041cf520f83bc5dff..0000000000000000000000000000000000000000 --- a/docs/source_zh_cn/api/api_cpp/hetero_cache.md +++ /dev/null @@ -1,402 +0,0 @@ -# HeteroClient - -[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.5.0/resource/_static/logo_source.svg)](../../../../include/datasystem/hetero_cache/hetero_client.h) - -## 接口汇总 -| 类名 | 说明 | -| --- | --- | -| [Blob](#blob) | 描述一段 device 上的内存。| -| [DeviceBlobList](#devicebloblist) | 描述 device 上的一组内存。| -| [HeteroClient](#heteroclient) | 异构对象客户端类。| -| [Future](#future) | 用于接收异步操作结果。| - -## Blob - -\#include <[datasystem/hetero_cache/hetero_client.h](../../../../include/datasystem/hetero_cache/hetero_client.h)> - -Blob 用于描述一段 device 上的内存,当前定义如下: - -```cpp -struct Blob { - void *pointer = 0; - uint64_t size = 0; -}; -``` - -pointer 表示 device 上的指针地址, size 表示指针指向的内存大小。 - -## DeviceBlobList - -\#include <[datasystem/hetero_cache/hetero_client.h](../../../../include/datasystem/hetero_cache/hetero_client.h)> - -DeviceBlobList 用于描述 device 上的一组内存,当前定义如下: - -```cpp -struct DeviceBlobList { - std::vector blobs; - int32_t deviceIdx = -1; -}; -``` -blobs 用于存放多个 [Blob](#blob), deviceIdx 指示 device 内存归属的 NPU 卡的 id。 - -## AsyncResult - -\#include <[datasystem/hetero_cache/hetero_client.h](../../../../include/datasystem/hetero_cache/hetero_client.h)> - -AsyncResult 用于描述异步请求的调用结果,当前定义如下: - -```cpp -struct AsyncResult { - Status status; - std::vector failedList; -}; -``` -status 用于表示异步执行的结果, failedList 用于表示失败的对象列表。 - - -## MetaInfo -\#include <[datasystem/hetero_cache/hetero_client.h](../../../../include/datasystem/hetero_cache/hetero_client.h)> - -用于描述存入key的元信息, 当前的定义如下: -```cpp -struct MetaInfo { - std::vector blobSizeList; -}; -``` -其中 blobSizeList 表示key对应原始存入数据的device内存块大小, 单位(字节) - - -## HeteroClient - -\#include <[datasystem/hetero_cache/hetero_client.h](../../../../include/datasystem/hetero_cache/hetero_client.h)> - -HeteroClient 为异构对象客户端类。 - -### 构造函数和析构函数 - -```cpp -explicit HeteroClient(const ConnectOptions &connectOptions = {}) -~HeteroClient() -``` - -### 公有成员函数 -| 函数 | 说明 | -|--------------------------------------------------------------------------------------------|--------| -| [`Status ShutDown()`](#shutdown) | 关闭异构对象客户端。 | -| [`Status Init()`](#init) | 初始化异构对象客户端。 | -| [`Status MGetH2D(const std::vector &keys, const std::vector &devBlobList, std::vector &failedKeys, int32_t subTimeoutMs)`](#mgeth2d) | 从 host 中获取数据写入 device。 | -| [`Status MSetD2H(const std::vector &keys, const std::vector &devBlobList, const SetParam &setParam = {});`](#msetd2h) | 将 device 的数据写入到 host。 | -| [`Status Delete(const std::vector &keys, std::vector &failedKeys)`](#delete) | 删除 host中的 key。 | -| [`Status GenerateKey(const std::string &prefix, std::string &key)`](#generatekey) | 生成带数据系统 Worker UUID 的 key。 | -| [`Status DevPublish(const std::vector &keys, const std::vector &devBlobList, std::vector &futureVec)`](#devpublish) | 将 device 上的内存发布为数据系统的异构对象。 | -| [`Status DevSubscribe(const std::vector &keys, const std::vector &devBlobList, std::vector &futureVec)`](#devsubscribe) | 订阅并接收 device 上的数据对象。 | -| [`Status DevMGet(const std::vector &keys, const std::vector &devBlobList, std::vector &failedKeys, int32_t subTimeoutMs = 0)`](#devmget) | 获取 device 上的对象。 | -| [`Status DevMSet(const std::vector &keys, const std::vector &devBlobList, std::vector &failedKeys)`](#devmset) | 将 device 对象写入数据系统。 | -| [`std::shared_future AsyncMSetD2H(const std::vector &keys, const std::vector &devBlobList, const SetParam &setParam = {});`](#AsyncMSetD2H) | 异步接口,将 device 对象写入数据系统。 | -| [`std::shared_future AsyncMGetH2D(const std::vector &keys, const std::vector &devBlobList, uint64_t subTimeoutMs)`](#AsyncMGetH2D) | 异步接口,获取 device 上的对象。 | -| [`Status DevLocalDelete(const std::vector &keys, std::vector &failedKeys)`](#devlocaldelete) | 删除本地 device 对象。 | -| [`std::shared_future AsyncDevDelete(const std::vector &keys)`](#asyncdevdelete) | 异步删除 device 对象。 | -| [`Status DevDelete(const std::vector &keys, std::vector &failedKeys)`](#devdelete) | 删除 device 对象。 | -| [`Status GetMetaInfo(const std::vector &keys, const bool isDevKey, std::vector &metaInfos, std::vector &failKeys)`](#getmetainfo) | 获取key对应的元数据信息 | -#### ShutDown - -```cpp -Status ShutDown() -``` - -关闭异构对象客户端,断开与数据系统 Worker 之间的连接。 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示关闭成功,否则返回其他错误码。 - -#### Init - -```cpp -Status Init() -``` - -初始化异构对象客户端,建立与数据系统 Worker 之间的连接。 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示初始化成功,否则返回其他错误码。 - -#### MGetH2D - -```cpp -Status MGetH2D(const std::vector &keys, const std::vector &devBlobList, std::vector &failedKeys, int32_t subTimeoutMs); -``` - -从 host 中获取数据并写入 device 中。 -MGetH2D 和 MSetD2H 需配套使用。 -若 MSetD2H 时将多个内存地址拼接写入了 host,则在 MGetH2D 中自动将 host 的数据拆分成多个内存地址写入 device。 -若 host 的 key 不再使用,可调用 Delete 接口删除。 - -- 参数 - - - `keys`: host 的 key 列表。约束:传入的 key 的数量不能超过 1 万。 - - `devBlobList`: 用于描述 device 上的 HBM 内存地址,用于接收从 host 中读取的数据。详见 [DeviceBlobList](#devicebloblist) 章节。 - - `failedKeys`: 失败的 key 列表。 - - `subTimeoutMs`: 超时时间,当在指定时间内无法获取完成,则返回异常。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示执行成功。 - - 返回值状态码为 `K_INVALID` 时表示传入参数未通过参数合法校验。 - -#### MSetD2H - -```cpp -Status MSetD2H(const std::vector &keys, const std::vector &devBlobList, const SetParam &setParam = {}); -``` - -将 device 的数据写入到 host 中。若 device 的 blob 中存在多个内存地址时,会自动将数据拼接后写入 host。 -若 host 的 key 不再使用,可调用 Delete 接口删除。 -MSetD2H 成功的数据是immutable的,不要对已存在的key set新值,否则新值不会生效。 - -- 参数 - - - `keys`: host 的 key 列表。约束:传入的key的数量不能超过1万。 - - `devBlobList`: 用于描述 device 上的 HBM 内存地址。详见 [DeviceBlobList](#devicebloblist) 章节。 - - `setParam`: key的配置参数, 默认值为: - ``` - struct SetParam { - WriteMode writeMode = WriteMode::NONE_L2_CACHE; - uint32_t ttlSecond = 0; - ExistenceOpt existence = ExistenceOpt::NONE; - CacheType cacheType = CacheType::MEMORY; - }; -- 返回值 - - - 返回值状态码为 `K_OK` 时表示执行成功。 - - 返回值状态码为 `K_INVALID` 时表示传入参数未通过参数合法校验。 - -#### Delete - -```cpp -Status Delete(const std::vector &keys, std::vector &failedKeys); -``` - -删除 host 中的 key。 -delete 接口与 MGetH2D / MSetD2H 配套使用。 - -- 参数 - - - `keys`: 待删除的 key 列表。约束:传入的 key 的数量不能超过 1 万。 - - `failedKeys`: 删除失败的 key 列表。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示删除成功。 - - 返回值状态码为 `K_INVALID` 时表示传入参数未通过参数合法校验。 - -#### GenerateKey - -```cpp -Status GenerateKey(const std::string &prefix, std::string &key); -``` - -生成带数据系统 Worker UUID 的 key。 - -- 参数 - - - `prefix`: key 前缀。 - - `key`: 传出参数,生成成功时会将 key 写入到该参数中。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示 key 生成成功。 - - 返回值状态码为 `K_INVALID` 时表示传入参数未通过参数合法校验。 - -#### DevPublish - -```cpp -Status DevPublish(const std::vector &keys, const std::vector &devBlobList, std::vector &futureVec); -``` - -将 device 上的内存发布为数据系统的异构对象。发布后的异构对象可通过 DevSubscribe 获取。 -DevPublish 和 DevSubscribe 需配套使用。 DevPublish 和 DevSubscribe 传入的 Device 内存地址不能归属于同一张 NPU 卡。 -通过 DevSubscribe 获取数据成功后,数据系统会自动删除此异构对象,不再管理此对象对应的 device 内存。 -在key,devBlobList内存地址映射关系均一致的情况下,DevPublish在同进程支持重试。 - -- 参数 - - - `keys`: device 的异构对象的 key。约束:传入的key的数量不能超过1万。 - - `devBlobList`: 用于描述 device 上内存结构列表。详见 [DeviceBlobList](#devicebloblist) 章节。 - - `futureVec`: 用于异步获取发布结果。若 future 返回 OK,则表示数据已被对端接收。详见 [Future](#future) 章节。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示数据发布成功。 - - 返回值状态码为 `K_RPC_UNAVAILABLE` 时表示请求遇到了网络错误。 - - 返回值状态码为 `K_INVALID` 时表示传入参数未通过参数合法校验。 - -#### DevSubscribe - -```cpp -Status DevSubscribe(const std::vector &keys, const std::vector &devBlobList, std::vector &futureVec); -``` - -订阅发布到数据系统异构对象,并接收数据写入 devBlobList 。 -数据通过 device to device 通道直接传输。 -DevPublish 和 DevSubscribe 需配套使用。 DevPublish 和 DevSubscribe 传入的 Device 内存地址不能归属于同一张 NPU 卡。 -通过 DevSubscribe 获取数据成功后,数据系统会自动删除此异构对象,不再管理此对象对应的 device 内存。 -在执行 DevSubscribe 过程中,执行了 DevPublish 的进程不能退出,否则 DevSubscribe 会失败。 -DevSubscribe单Key的订阅超时时间为20s,多key为60s。 - -- 参数 - - - `keys`: device 的异构对象的 key。 - - `devBlobList`: 用于描述 device 上内存结构列表,用于接收数据。详见 [DeviceBlobList](#devicebloblist) 章节。 - - `futureVec`: 用于异步获取订阅结果。若 future 返回 OK,则表示数据已接收成功。详见 [Future](#future) 章节。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示对象订阅成功。约束:传入的key的数量不能超过1万。 - - 返回值状态码为 `K_RPC_UNAVAILABLE` 时表示请求遇到了网络错误。 - - 返回值状态码为 `K_INVALID` 时表示传入参数未通过参数合法校验。 - -#### DevMGet - -```cpp -Status DevMGet(const std::vector &keys, const std::vector &devBlobList, std::vector &failedKeys, int32_t subTimeoutMs = 0); -``` - -获取 device 中的数据,并写入到 devBlobList 中。数据通过 device to device 通道直接传输。 -DevMSet 和 DevMGet 需配套使用。 DevMSet 和 DevMGet 传入的 Device 内存地址不能归属于同一张 NPU 卡。 -DevMGet 后不会自动删除异构对象,如对象不再使用,可调用 DevLocalDelete 或 DevDelete 删除。 -在执行 DevMGet 过程中,执行了 DevMSet 的进程不能退出,否则 DevMGet 会失败。 - -- 参数 - - - `keys`: device 的异构对象的 key。约束:传入的key的数量不能超过1万。 - - `devBlobList`: 用于描述 device 上内存结构列表。详见 [DeviceBlobList](#devicebloblist) 章节。 - - `failedKeys`: 输出参数,用于描述失败的 key 的列表。 - - `subTimeoutMs`: 超时时间,当在指定时间内无法获取完成,则抛出异常。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示至少有一个对象获取成功。 - - 返回值状态码为 `K_INVALID` 时表示传入参数未通过参数合法校验。 - - 返回值状态码为 `K_NOT_FOUND` 时表示所有对象都无法获取到。 - - 返回值状态码为 `K_RUNTIME_ERROR` 时表示获取对象遇到了错误。 - -#### DevMSet - -```cpp -Status DevMSet(const std::vector &keys, const std::vector &devBlobList, std::vector &failedKeys); -``` - -通过数据系统缓存 Device 上的数据,将 devBlobList 对应的 key 的元数据写入数据系统,可供其他 client 访问。 -DevMSet 和 DevMGet 需配套使用。 DevMSet 和 DevMGet 传入的 Device 内存地址不能归属于同一张 NPU 卡。 -DevMGet 后不会自动删除异构对象,如对象不再使用,可调用 DevLocalDelete 或 DevDelete 删除。 -在key,devBlobList内存地址映射关系均一致的情况下,DevMSet在同进程支持重试。 - -- 参数 - - - `keys`: device 的异构对象的 key。约束:传入的key的数量不能超过1万。 - - `devBlobList`: 用于描述 device 上内存结构列表。详见 [DeviceBlobList](#devicebloblist) 章节。 - - `failedKeys`: 输出参数,用于描述失败的key的列表。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示至少有一个对象DevMSet成功。 - - 返回值状态码为 `K_INVALID` 时表示传入参数未通过参数合法校验。 - -#### DevLocalDelete - -```cpp -Status DevLocalDelete(const std::vector &keys, std::vector &failedKeys); -``` - -从数据系统删除本节点上此 key 的元数据,不再管理此 key 对应的 device 内存。 -DevLocalDelete 与 DevMSet / DevMGet 接口配套使用。 - -- 参数 - - - `keys`: device 的异构对象的 key。约束:传入的key的数量不能超过1万。 - - `failedKeys`: 输出参数,用于描述失败的 key 的列表。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示至少有一个对象DevLocalDelete成功,否则返回其他错误码。 - -#### DevDelete - -```cpp -Status DevDelete(const std::vector &keys, std::vector &failedKeys); -``` - -从数据系统删除此 key 的元数据,不再管理此 key 对应的 device 内存。 -DevDelete 与 DevMSet / DevMGet 接口配套使用。 - -- 参数 - - - `keys`: device 的异构对象的 key。约束:传入的 key 的数量不能超过 1 万。 - - `failedKeys`: 输出参数,用于描述失败的 key 的列表。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示至少有一个对象DevDelete成功,否则返回其他错误码。 - -#### AsyncDevDelete - -```cpp -std::shared_future AsyncDevDelete(const std::vector &keys); -``` - -异步接口,从数据系统删除此 key 的元数据,不再管理此 key 对应的 device 内存。 -AsyncDevDelete 与 DevMSet / DevMGet 接口配套使用。 - -- 参数 - - - `keys`: device 的异构对象的 key。约束:传入的 key 的数量不能超过 1 万。 - -- 返回值 - - 通过返回的future查询异步删除请求的调用结果 - -#### GetMetaInfo -```cpp -Status GetMetaInfo(const std::vector &keys, const bool isDevKey, std::vector &metaInfos, std::vector &failKeys) -``` -获取key对应的元数据信息 - -- 参数 - - - `keys`: 输入参数,device 的异构对象的 key。约束:传入的 key 的数量不能超过 1 万。 - - `isDevKey`: 输入参数,key的属性,true 表示D2D类型,false表示D2H类型。 - - `metaInfos`: 输出参数,用于描述key的元信息。 - - `failKeys`: 输出参数,用于描述失败列表。 -- 返回值 - - 返回值状态码为 `K_OK` 时表示至少有一个对象GetMetaInfo成功,否则返回其他错误码。 - - -## Future - -\#include <[datasystem/hetero_cache/future.h](../../../../include/datasystem/hetero_cache/future.h)> - -Future 用于接收异步操作的结果。 - -### 公有成员函数 - -| 函数 | 说明 | -|-------------------------------------------------------------------------------|--------| -| [`Status Get(uint64_t subTimeoutMs = 60000)`](#get) | 获取异步任务的执行结果。 | - -#### Get - -```cpp -Status Get(uint64_t subTimeoutMs = 60000) -``` - -获取异步任务的执行结果。 - -- 参数 - - - `subTimeoutMs`: 描述等待时长。如果 subTimeoutMs 大于0, 则阻塞直到超时或结果变为可用;如果 subTimeoutMs 等于0,则立即返回结果状态。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示异步操作执行成功,否则返回其他错误码。 \ No newline at end of file diff --git a/docs/source_zh_cn/api/api_cpp/kv_cache.md b/docs/source_zh_cn/api/api_cpp/kv_cache.md deleted file mode 100644 index ae1413bd3de683446a347baea49fee2916a94706..0000000000000000000000000000000000000000 --- a/docs/source_zh_cn/api/api_cpp/kv_cache.md +++ /dev/null @@ -1,391 +0,0 @@ -# KVClient - -[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.5.0/resource/_static/logo_source.svg)](../../../../include/datasystem/kv_cache.h) - -## 接口汇总 - -| 类名 | 说明 | -|--------------------------------|---------------------------------------------| -|[`class KVClient`](#class-kvclient) | KV缓存客户端类| -|[`enum ExistenceOpt`](#enum-existenceopt) |该选项用于配置对象存在时是否允许继续操作 | -|[`class ReadOnlyBuffer`](#class-readonlybuffer) | 只读缓冲区结构类 | -|[`struct MSetParam`](#struct-msetparam) | 同时创建多个Key时设置的属性 | -|[`struct ReadParam`](#struct-readparam) | 偏移读取Key时设置的属性 | -|[`struct SetParam`](#struct-setparam) | 创建Key时设置的属性 | - -## class KVClient - -\#include <[datasystem/kv_cache/kv_client.h](../../../../include/datasystem/kv_cache/kv_client.h)> - -KV缓存对象类 - -### 构造函数和析构函数 -#### explicit KVClient (const ConnectOptions &connectOptions) - -构造[KVClient](#class-kvclient). - -- 参数 - - `connectOptions` 配置与 Worker 的连接选项,包括IP地址和端口,详见[ConnectOptions](common.md#connectoptions)章节 - - -#### ~KVClient () - -析构[KVClient](#class-kvclient). - -### 公有成员函数 - - 函数 | 说明 ---------------------------------|--------------------------------------------- -[`Status Init ()`](#status-init-) | 建立[KVClient](#class-kvclient)与当前数据系统 Worker 之间的连接并完成初始化。 -[`Status ShutDown ()`](#status-shutdown-) | 断开[KVClient](#class-kvclient)与当前数据系统 Worker 之间的连接。 -[`Status Set (const std::string &key, const StringView &val, const SetParam ¶m)`](#set-by-key) | 设置键值对数据。 -[`std::string Set (const StringView &val, const SetParam ¶m)`](#set-by-value) | 设置键值对数据,用户传入值,由接口自动生成键并返回。 -[`Status MSetTx (const std::vector &keys, const std::vector &vals, const MSetParam ¶m)`](#status-msettx) | 事务性创建多键值对接口。 -[`Status MSet (const std::vector &keys, const std::vector &vals, std::vector &outFailedKeys, const MSetParam ¶m)`](#status-mset) | 键值对批量设置接口。 -[`Status Get (const std::string &key, std::string &val, int32_t subTimeoutMs)`](#status-get) | 获取单个数据。 -[`Status Get (const std::string &key, Optional &readOnlyBuffer, int32_t subTimeoutMs)`](#get-readonlybuffer) | 获取单个数据的指针,获取后不可修改。 -[`Status Get (const std::vector &keys, std::vector &vals, int32_t subTimeoutMs)`](#batchget) | 批量获取数据。 -[`Status Get (const std::vector &keys, std::vector &readOnlyBuffers, int32_t subTimeoutMs)`](#batchget-readonlybuffer) | 批量获取多个数据的指针,获取后不可修改。 -[`Status Read (const std::vector &readParams, std::vector> &readOnlyBuffers)`](#status-read) | 偏移读接口,支持获取指定键值的其中一部分。 -[`Status Del (const std::string &key)`](#del) | 删除指定键值对。 -[`Status Del (const std::vector &keys, std::vector &failedKeys)`](#batchdel) | 批量删除指定键值对。 -[`Status GenerateKey (const std::string &prefixKey, std::string &key)`](#generatekey) | 生成具有指定前缀的带workerId的key,以供Set接口使用。 -[`Status HealthCheck ()`](#status-healthcheck-) | 检查连接的 Worker 是否健康。 -[`Status Expire (const std::vector &keys, uint32_t ttlSeconds, std::vector &failedKeys)`](#status-expire) | 为指定数据更新过期生命周期时间。 - -#### Status Init () - -建立[KVClient](#class-kvclient)与当前数据系统 Worker 之间的连接并完成初始化。 - -- 返回值 - 返回值状态码为 `K_OK` 时表示初始化成功,否则返回其他错误码。 - -#### Status ShutDown () - -断开[KVClient](#class-kvclient)与当前数据系统 Worker 之间的连接。 - -- 返回值 - 返回值状态码为 `K_OK` 时表示断链成功,否则返回其他错误码。 - - -#### Status Set (const std::string &key, const StringView &val, const [SetParam](#struct-setparam) ¶m) - -设置键值对数据。 - -- 参数 - - `key` 键 - - `val` 值 - - `param` 设置参数,详见[SetParam](#struct-setparam)章节 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示键值对设置成功。 - - 返回值状态码为 `K_INVALID`时表示参数校验不通过 - - -#### std::string Set (const StringView &val, const [SetParam](#struct-setparam) ¶m) - -设置键值对数据,用户传入值,由接口自动生成键并返回。 - -- 参数 - - `val` 值 - - `param` 设置参数,详见[SetParam](#struct-setparam)章节 - -- 返回值 - - 成功时返回key - - 失败时返回空字符串 - - -#### Status MSetTx (const std::vector\ &keys, const std::vector\ &vals, const [MSetParam](#struct-msetparam) ¶m) - -事务性创建多键值对接口。支持事务性地创建一组键值对,键值对数量限制为1个到8个。如果有一个键已存在,则所有键值对都不会创建。 - - -- 参数 - - `keys` 需要设置的一组key. 约束:传入的key的数量不能超过8。 - - `vals` 需要设置的一组key对应的value. - - `param` 设置参数,详见[MSetParam](#struct-msetparam)章节. - -- 返回值 - 返回值状态码为 `K_OK` 时表示设置成功,否则返回其他错误码。 - - -#### Status MSet (const std::vector\ &keys, const std::vector\ &vals, std::vector\ &outFailedKeys, const [MSetParam](#struct-msetparam) ¶m) - -键值对批量设置接口。可批量设置键值对并返回失败的键。批量设置个数需小于2000,设置的每个值需小于500KB。 - -- 参数 - - `keys` 需要设置的一组key. 约束:传入的key的数量需要小于2千。 - - `vals` 需要设置的一组key对应的value. - - `outFailedKeys` 传出参数,代表设置失败的key. - - `param` 设置参数,详见[MSetParam](#struct-msetparam)章节. - -- 返回值 - 返回值状态码为 `K_OK` 时表示设置成功,否则返回其他错误码。 - - -#### Status Get (const std::string &key, std::string &val, int32_t subTimeoutMs) - -获取单个数据。 - -- 参数 - - `key` 键. - - `val` 传出参数,返回键对应的数据. - - `subTimeoutMs` 支持订阅不存在的数据,subTimeoutMs表示订阅等待的时长,单位ms。不允许为负数,默认值为0表示不等待. - -- 返回值 - - 返回`K_OK`表示获取成功 - - 返回`K_INVALID`表示`key`校验不通过 - - 返回`K_NOT_FOUND`表示`key`不存在 - - 返回`K_RPC_UNAVAILABLE` 时表示请求遇到了网络错误。 - - 返回`K_RUNTIME_ERROR`表示 worker 侧存在错误 - - -#### Status Get (const std::string &key, Optional\<[ReadOnlyBuffer](#class-readonlybuffer)\> &readOnlyBuffer, int32_t subTimeoutMs) - -获取单个数据的指针,获取后不可修改。该接口相比[`Status Get (const std::string &key, std::string &val, int32_t timeoutMs`)](#get)少一次拷贝,性能更优。 - -- 参数 - - `key` 键. - - `subTimeoutMs` 支持订阅不存在的数据,subTimeoutMs表示订阅等待的时长,单位ms。不允许为负数,默认值为0表示不等待. - - - `readOnlyBuffer` 传出参数,返回的使用[Optional](common.md#optional)封装的只读数据缓冲区. - -- 返回值 - - 返回`K_OK`表示获取成功 - - 返回`K_INVALID`表示`key`校验不通过 - - 返回`K_NOT_FOUND`表示`key`不存在 - - 返回`K_RPC_UNAVAILABLE` 时表示请求遇到了网络错误。 - - 返回`K_RUNTIME_ERROR`表示 worker 侧存在错误 - - -#### Status Get (const std::vector\ &keys, std::vector\ &vals, int32_t subTimeoutMs) - -批量获取数据。 - -- 参数 - - `keys` 需要获取的一组key. 约束:传入的key的数量不能超过1万。 - - `subTimeoutMs` 支持订阅不存在的数据,subTimeoutMs表示订阅等待的时长,单位ms。不允许为负数,默认值为0表示不等待. - - `vals` 传出参数,返回一组获取的数据。若有部分数据获取不成功,则对应位置的vector的对象为空。 - -- 返回值 - - 返回`K_OK`表示至少有一个数据获取成功 - - 返回`K_INVALID`表示存在key校验不通过 - - 返回`K_NOT_FOUND`表示所有`keys`不存在 - - 返回`K_RPC_UNAVAILABLE` 时表示请求遇到了网络错误。 - - 返回`K_RUNTIME_ERROR`表示 worker 侧存在错误 - - -#### Status Get (const std::vector\ &keys, std::vector\\> &readOnlyBuffers, int32_t subTimeoutMs) - -批量获取多个数据的指针,获取后不可修改。该接口相比[`Status Get (const std::vector &keys, std::vector &vals, int32_t timeoutMs)`](#batchget)少一次拷贝,性能更优。 - -- 参数 - - `keys` 需要获取的一组key. 约束:传入的key的数量不能超过1万。 - - `subTimeoutMs` 支持订阅不存在的数据,subTimeoutMs表示订阅等待的时长,单位ms。不允许为负数,默认值为0表示不等待. - - `readOnlyBuffers` 传出参数,返回的一组使用[Optional](common.md#optional)封装的只读数据缓冲区。若有部分数据获取不成功,则对应位置的vector的对象为空。 - -- 返回值 - - 返回`K_OK`表示至少有一个数据获取成功 - - 返回`K_INVALID`表示存在key校验不通过 - - 返回`K_RPC_UNAVAILABLE` 时表示请求遇到了网络错误。 - - 返回`K_NOT_FOUND`表示所有`keys`不存在 - - 返回`K_RUNTIME_ERROR`表示 worker 侧存在错误 - - -#### Status Read (const std::vector\<[ReadParam](#struct-readparam)> &readParams, std::vector\\> &readOnlyBuffers) - -偏移读接口,支持获取指定键值的其中一部分。在某些场景下,可避免读放大带来的性能损失。 - -- 参数 - - `readParams` 指定要查询的一个或多个键,详见[ReadParam](#struct-readparam)章节. 约束:传入的数量不能超过1万。 - - `readOnlyBuffers` 传出参数,返回的一组使用[Optional](common.md#optional)封装的只读数据缓冲区。若有部分数据获取不成功,则对应位置的vector的对象为空。 - -- 返回值 - - 返回`K_OK`表示至少有一个数据获取成功 - - 返回`K_INVALID`表示存在key校验不通过 - - 返回`K_NOT_FOUND`表示所有`keys`不存在 - - 返回`K_RPC_UNAVAILABLE` 时表示请求遇到了网络错误。 - - 返回`K_RUNTIME_ERROR`表示 worker 侧存在错误 - - - -#### Status Del (const std::string &key) - -删除指定键值对。key不存在时视为删除成功。 - -- 参数 - - `key` 键. - -- 返回值 - 返回值状态码为 `K_OK` 时表示初始化成功,否则返回其他错误码。 - - -#### Status Del (const std::vector\ &keys, std::vector\ &failedKeys) - -批量删除指定键值对。key不存在时视为删除成功。 - -- 参数 - - `keys` 需要删除的一组key. 约束:传入的key的数量不能超过1万。 - - `failedKeys` 传出参数,返回删除失败的key. - -- 返回值 - - 返回`K_OK`表示至少有一个数据删除成功 - - 返回`K_INVALID`表示存在key校验不通过 - - 返回值状态码为 `K_RPC_UNAVAILABLE` 时表示请求遇到了网络错误。 - - 返回`K_RUNTIME_ERROR`表示 worker 侧存在错误 - - -#### Status GenerateKey (const std::string &prefixKey, std::string &key) - -生成具有指定前缀的带workerId的key,以供Set接口使用。具有workerId的key具有元数据本节点亲和性,执行Set时性能更优。 - -- 参数 - - `prefixKey` 用户指定key的前缀. - - `key` 传出参数,返回生成的key. - -- 返回值 - 返回值状态码为 `K_OK` 时表示生成成功,否则返回其他错误码。 - -#### Status HealthCheck () - -检查连接的 Worker 是否健康。 - -- 返回值 - 返回值状态码为 `K_OK` 时表示 Worker 健康,否则返回其他错误码。 - - -#### Status KVClient::Exist(const std::vector<std::string> &keys, std::vector &exists) - -批量查询一组键(keys)是否存在,并返回每个键的存在性状态。支持最多10000个键的查询。 - -- 参数 - - `keys` 待查询的键列表,最大支持10000个键 - - `exists` 传出参数,返回每个键的存在性状态 - -- 返回值 - - 返回`K_OK`表示查询成功 - - 返回`K_INVALID`表示提供的键中包含非法字符或为空 - - 返回`K_RPC_UNAVAILABLE` 表示请求遇到了网络错误 - - 返回`K_NOT_READY` 表示服务当前无法处理请求 - - 返回`K_RUNTIME_ERROR`表示 worker 侧存在错误 - - - -#### Status Expire (const std::vector<std::string> &keys, uint32_t ttlSeconds, std::vector<std::string> &failedKeys) - -批量为一组键(keys)更新过期生命周期(ttlSeconds),并返回更新失败的键(failedKeys)。最多支持 10000 个键的查询。 - -- 参数 - - `keys` 待更新生命周期的键列表 - - `ttlSeconds` 为键设置的新的生命周期,单位为秒 - - `failedKeys` 传出参数,返回操作失败的键 - -- 返回值 - - 返回`K_OK`表示至少有一个键设置生命周期成功 - - 返回`K_INVALID`表示提供的键中包含非法字符或为空 - - 返回`K_NOT_FOUND`表示所有`keys`不存在 - - 返回`K_RPC_UNAVAILABLE` 表示请求遇到了网络错误 - - 返回`K_NOT_READY` 表示服务当前无法处理请求 - - 返回`K_RUNTIME_ERROR`表示 worker 侧存在错误 - -## enum ExistenceOpt - -\#include <[datasystem/kv_cache/kv_client.h](../../../../include/datasystem/kv_cache/kv_client.h)> - -用于配置对象存在时是否允许继续操作的枚举类。 - - 定义 | 说明 ---------------------------------|--------------------------------------------- -NONE | 允许Key存在时执行Set -NX | 不允许Key存在时执行Set - -## class ReadOnlyBuffer - -\#include <[datasystem/kv_cache/read_only_buffer.h](../../../../include/datasystem/kv_cache/read_only_buffer.h)> - -### 构造函数和析构函数 - -#### ReadOnlyBuffer () - -构造只读缓冲区结构类 - -#### ~ReadOnlyBuffer () - -析构只读缓冲区结构类 - -### 公用成员函数 - - 函数 | 说明 ---------------------------------|---------- -[`int64_t GetSize () const`](#int64_t-getsize--const) | 获取数据缓冲区的大小。 -[`const void* ImmutableData ()`](#const-void-immutabledata-) | 获取数据缓冲区的只读指针。 -[`Status RLatch (uint64_t timeout)`](#status-rlatch-uint64_t-timeout) | 对数据缓冲区加读锁。 -[`Status UnRLatch ()`](#status-unrlatch-) | 释放数据缓冲区的读锁。 - - -#### int64_t GetSize () const - -获取数据缓冲区的大小。 - -- 返回值 -数据缓冲区的大小,单位是Byte. - -#### const void* ImmutableData () - -获取数据缓冲区的只读指针。 - -- 返回值 -数据缓冲区的只读指针 - -#### Status RLatch (uint64_t timeout) - -对数据缓冲区加读锁,保护对应的内存不被并发写(允许并发读)。 -- 参数 - - `timeout` 加锁超时时间,单位是:秒,默认超时时间为60秒 - -- 返回值 - 返回值状态码为 `K_OK` 时表示加锁成功,否则返回其他错误码。 - -#### Status UnRLatch () - -释放数据缓冲区的读锁。 - -- 返回值 - 返回值状态码为 `K_OK` 时表示加锁成功,否则返回其他错误码。 - -## struct MSetParam - -\#include <[datasystem/kv_cache/kv_client.h](../../../../include/datasystem/kv_cache/kv_client.h)> - -同时创建多个Key时设置的属性。 - - 函数 | 说明 ---------------------------------|--------------------------------------------- -WriteMode writeMode | 设置数据可靠性级别,默认不写入二级缓存。详见[WriteMode](object_cache.md#writemode)章节 -uint32_t ttlSecond | 设置Key的存活时间,单位:秒。Key达到存活时间后系统自动将其删除。默认为0,表示不设置存活时间,Key会一直存在直到显式调用Del接口。注意:系统重启后存活时间计时将重新开始 -ExistenceOpt existence | 配置Key存在时是否允许继续操作,默认允许。详见[ExistenceOpt](#enum-existenceopt)章节 - -## struct ReadParam - -\#include <[datasystem/kv_cache/kv_client.h](../../../../include/datasystem/kv_cache/kv_client.h)> - -偏移读取Key时设置的属性。 - - 函数 | 说明 ---------------------------------|--------------------------------------------- -std::string key | 要读取的Key -uint64_t offset | 指定从Key对应值的特定偏移量开始读取 -uint64_t size | 从偏移量开始,要读取的大小 - -## struct SetParam - -\#include <[datasystem/kv_cache/kv_client.h](../../../../include/datasystem/kv_cache/kv_client.h)> - -创建Key时设置的属性。 - - 函数 | 说明 ---------------------------------|--------------------------------------------- -WriteMode writeMode | 设置数据可靠性级别,默认不写入二级缓存。详见[WriteMode](object_cache.md#writemode)章节 -uint32_t ttlSecond | 设置Key的存活时间,单位:秒。Key达到存活时间后系统自动将其删除。默认为0,表示不设置存活时间,Key会一直存在直到显式调用Del接口。注意:系统重启后存活时间计时将重新开始 -ExistenceOpt existence | 配置Key存在时是否允许继续操作,默认允许。详见[ExistenceOpt](#enum-existenceopt)章节 -CacheType | key 数据保存位置 详见[CacheType](object_cache.md#CacheType) diff --git a/docs/source_zh_cn/api/api_cpp/object_cache.md b/docs/source_zh_cn/api/api_cpp/object_cache.md deleted file mode 100644 index 04c6a51184bdace9fca4a7e8ce86463d4eb99cef..0000000000000000000000000000000000000000 --- a/docs/source_zh_cn/api/api_cpp/object_cache.md +++ /dev/null @@ -1,479 +0,0 @@ -# ObjectClient - -[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.5.0/resource/_static/logo_source.svg)](../../../../include/datasystem/object_cache.h) - -## 接口汇总 - -| 类名 | 说明 | -| --- | --- | -| [ObjectClient](#objectclient) | 对象缓存客户端类。| -| [Buffer](#buffer) | 对象缓存数据类。| -| [CreateParam](#createparam) | 创建对象时的配置参数类。| -| [WriteMode](#writemode) | 配置对象可靠性的枚举类。| -| [ConsistencyType](#consistencytype) | 配置对象一致性的枚举类。| -| [CacheType](#cachetype) | 配置对象缓存类型。| - -## ObjectClient - -\#include <[datasystem/object_cache/object_client.h](../../../../include/datasystem/object_cache/object_client.h)> - -Buffer 类用于表示对象缓存数据类。 - -### 构造函数和析构函数 - -```cpp -explicit ObjectClient(const ConnectOptions &connectOptions = {}) -~ObjectClient() -``` - -### 公有成员函数 - -| 函数 | 说明 | -|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------| -| [`Status Init()`](#init) | 初始化客户端。 | -| [`Status ShutDown()`](#shutdown) | 关闭客户端。 | -| [`Status GIncreaseRef(const std::vector &objectKeys, std::vector &failedObjectKeys)`](#gincreaseref) | 增加对象的全局引用计数。 | -| [`Status GDecreaseRef(const std::vector &objectKeys, std::vector &failedObjectKeys)`](#gdecreaseref) | 减少对象的全局引用计数。 | -| [`int QueryGlobalRefNum(const std::string &objectKey)`](#queryglobalrefnum) | 查询对象的全局引用计数。 | -| [`Status Create(const std::string &objectKey, uint64_t size, const CreateParam ¶m, std::shared_ptr &buffer)`](#create) | 创建对象 Buffer。 | -| [`Status Put(const std::string &objectKey, const uint8_t *data, uint64_t size, const CreateParam ¶m, const std::unordered_set &nestedObjectKeys = {})`](#put) | 创建或更新对象并发布。 | -| [`Status Get(const std::vector &objectKeys, int32_t subTimeoutMs, std::vector> &buffers)`](#get) | 获取对象。 | -| [`Status GenerateObjectKey(const std::string &prefix, std::string &objectKey)`](#generateobjectkey) | 生成带数据系统 Worker UUID 的对象 key。 | -| [`Status HealthCheck()`](#healthcheck) | 检查当前正在连接的数据系统 Worker 健康检查状况。 | - -#### ShutDown - -```cpp -Status ShutDown() -``` - -断开对象缓存客户端与当前数据系统 Worker 之间的连接。 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示断链成功,否则返回其他错误码。 - -#### Init - -```cpp -Status Init() -``` - -建立对象缓存客户端与当前数据系统 Worker 之间的连接并完成初始化。 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示初始化成功,否则返回其他错误码。 - -#### GIncreaseRef - -```cpp -Status GIncreaseRef(const std::vector &objectKeys, std::vector &failedObjectKeys) -``` - -增加对象的全局引用计数。 - -- 参数 - - - `objectKeys`: 需要增加全局引用计数的对象 key 数组。约束:传入的object key的数量不能超过1万。 - - `failedObjectKeys`: 传出参数,增加全局引用计数失败的对象 key 会被保存在该字符串数组中。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示至少有一个对象增加全局引用计数成功。 - - 返回值状态码为 `K_RPC_UNAVAILABLE` 时表示请求遇到了网络错误。 - - 返回值状态码为 `K_INVALID` 时表示传入参数未通过参数合法校验。 - -#### GDecreaseRef - -```cpp -Status GDecreaseRef(const std::vector &objectKeys, std::vector &failedObjectKeys) -``` - -减少对象的全局引用计数。 - -- 参数 - - - `objectKeys`: 需要减少全局引用计数的对象 key 数组。约束:传入的object key的数量不能超过1万。 - - `failedObjectKeys`: 传出参数,减少全局引用计数失败的对象 key 会被保存在该字符串数组中。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示至少有一个对象减少全局引用计数成功。 - - 返回值状态码为 `K_RPC_UNAVAILABLE` 时表示请求遇到了网络错误。 - - 返回值状态码为 `K_INVALID` 时表示传入参数未通过参数合法校验。 - -#### QueryGlobalRefNum - -```cpp -int QueryGlobalRefNum(const std::string &objectKey) -``` - -查询对象的全局引用计数。 - -- 参数 - - - `objectKey`: 对象 key。 - -- 返回值 - - 返回值为大于等于 0 的数字时表示查询成功,返回值即为对象 key 的全局引用计数;返回 -1 时表示查询失败。 - -#### Create - -```cpp -Status Create(const std::string &objectKey, uint64_t size, const CreateParam ¶m, - std::shared_ptr &buffer) -``` - -创建对象 Buffer。 - -- 参数 - - - `objectKey`: 对象 key。 - - `size`: 对象大小(以字节为单位)。 - - `param`: 详见 [CreateParam](#createparam) 章节。 - - `buffer`: 传出参数,[Buffer](#buffer)。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示创建对象成功。 - - 返回值状态码为 `K_RPC_UNAVAILABLE` 时表示请求遇到了网络错误。 - - 返回值状态码为 `K_INVALID` 时表示传入参数未通过参数合法校验。 - -#### Put - -```cpp -Status Put(const std::string &objectKey, const uint8_t *data, uint64_t size, const CreateParam ¶m, - const std::unordered_set &nestedObjectKeys = {}) -``` - -创建或更新对象并发布。 - -- 参数 - - - `objectKey`: 对象 key。 - - `data`: 数据内存地址指针。 - - `size`: 数据大小(以字节为单位)。 - - `param`: 详见 [CreateParam](#createparam) 章节。 - - `nestedObjectKeys`: 对该对象 key 有依赖关系的对象 key 数组。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示对象创建或更新并发布成功。 - - 返回值状态码为 `K_RPC_UNAVAILABLE` 时表示请求遇到了网络错误。 - - 返回值状态码为 `K_INVALID` 时表示传入参数未通过参数合法校验。 - -#### Get - -```cpp -Status Get(const std::vector &objectKeys, int32_t subTimeoutMs, std::vector> &buffers) -``` - -获取对象。 - -- 参数 - - - `objectKeys`: 需要获取的对象 key 数组。约束:传入的object key的数量不能超过1万。 - - `subTimeoutMs`: 对象订阅时间(以毫秒为单位);对象未就绪时,产生订阅等待对象就绪返回,0 表示不订阅,可配置范围为[0, INT32_MAX]。 - - `buffers`: 对象 [Buffer](#buffer)。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示至少有一个对象获取成功。 - - 返回值状态码为 `K_INVALID` 时表示传入参数未通过参数合法校验。 - - 返回值状态码为 `K_NOT_FOUND` 时表示所有对象都无法获取到。 - - 返回值状态码为 `K_RUNTIME_ERROR` 时表示获取对象遇到了错误。 - -#### GenerateObjectKey - -```cpp -Status GenerateObjectKey(const std::string &prefix, std::string &objectKey) -``` - -生成带数据系统 Worker UUID 的对象 key。 - -- 参数 - - - `prefix`: 对象 key 前缀。 - - `objectKey`: 传出参数,生成成功时会将对象 key 写入到该参数中。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示对象 key 生成成功。 - - 返回值状态码为 `K_INVALID` 时表示传入参数未通过参数合法校验。 - -#### HealthCheck - -```cpp -Status HealthCheck() -``` - -检查当前正在连接的数据系统 Worker 健康检查状况。 - -- 返回值 - - - 返回值状态码为 `K_OK` 时表示 Worker 状态健康,否则返回其他错误码。 - -## Buffer - -\#include <[datasystem/object_cache/buffer.h](../../../../include/datasystem/object_cache/buffer.h)> - -Buffer 类用于表示对象缓存数据类。 - -### 构造函数和析构函数 - -```cpp -Buffer() -Buffer(Buffer &&other) noexcept -~Buffer() = default; -``` - -### 公有成员函数 - -| 函数 | 说明 | -|-------------------------------------------------------------------------------|--------| -| [`Status MemoryCopy(const void *data, uint64_t length)`](#memorycopy) | 将数据拷贝到 `Buffer` 的缓存。 | -| [`int64_t GetSize() const`](#getsize) | 获取对象 `Buffer` 的大小。 | -| [`Status Publish(const std::unordered_set &nestedKeys = {})`](#publish) | 将 `Buffer` 的数据发布到数据系统。 | -| [`Status Seal(const std::unordered_set &nestedKeys = {})`](#seal) | 将 `Buffer` 的数据发布到数据系统,并不再允许修改。 | -| [`Status WLatch(uint64_t timeoutSec = 60)`](#wlatch) | 对 `Buffer` 添加写锁。 | -| [`Status RLatch(uint64_t timeoutSec = 60)`](#rlatch) | 对 `Buffer` 添加读锁。 | -| [`Status UnRLatch()`](#unrlatch) | 对 `Buffer` 解除读锁。 | -| [`Status UnWLatch()`](#unwlatch) | 对 `Buffer` 解除写锁。 | -| [`void *MutableData()`](#mutabledata) | 获取 `Buffer` 可读写的缓存数据指针。 | -| [`const void *ImmutableData()`](#immutabledata) | 获取 `Buffer` 只读缓存数据指针。 | -| [`Status InvalidateBuffer()`](#invalidatebuffer) | 使当前主机上的 `Buffer` 数据无效化。 | - -#### MemoryCopy - -```cpp -Status MemoryCopy(const void *data, uint64_t length) -``` - -将数据拷贝到 `Buffer` 的缓存。 - -- 参数 - - - `data`: 需要拷贝的数据内存地址。 - - `length`: 需要拷贝的数据长度。 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示数据拷贝成功,否则返回其他错误码。 - -#### GetSize - -```cpp -int64_t GetSize() const -``` - -获取对象 `Buffer` 的大小。 - -- 返回值 - - `Buffer` 大小(以字节为单位)。 - -#### Publish - -```cpp -Status Publish(const std::unordered_set &nestedKeys = {}) -``` - -将 `Buffer` 的数据发布到数据系统。 - -- 参数 - - - `nestedKeys`: 依赖的嵌套对象 key 数组。 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示发布成功,否则返回其他错误码。 - -#### Seal - -```cpp -Status Seal(const std::unordered_set &nestedKeys = {}) -``` - -将 `Buffer` 的数据发布到数据系统,并不再允许修改。 - -- 参数 - - - `nestedKeys`: 依赖的嵌套对象 key 数组。 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示发布成功,否则返回其他错误码。 - -#### WLatch - -```cpp -Status WLatch(uint64_t timeoutSec = 60) -``` - -对 `Buffer` 添加写锁。 - -- 参数 - - - `timeoutSec`: 添加写锁的超时时间,默认为 60 秒。 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示加写锁成功,否则返回其他错误码。 - -#### RLatch - -```cpp -Status RLatch(uint64_t timeoutSec = 60) -``` - -对 `Buffer` 添加读锁。 - -- 参数 - - - `timeoutSec`: 添加读锁的超时时间,默认为 60 秒。 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示加读锁成功,否则返回其他错误码。 - -#### UnRLatch - -```cpp -Status UnRLatch() -``` - -对 `Buffer` 解除读锁。 - - -- 返回值 - - 返回值状态码为 `K_OK` 时表示解读锁成功,否则返回其他错误码。 - -#### UnWLatch - -```cpp -Status UnWLatch() -``` - -对 `Buffer` 解除写锁。 - - -- 返回值 - - 返回值状态码为 `K_OK` 时表示解写锁成功,否则返回其他错误码。 - -#### MutableData - -```cpp -void *MutableData() -``` - -获取 `Buffer` 可读写的缓存数据指针。 - -- 返回值 - - 返回值为可读写的缓存数据指针。 - -#### ImmutableData - -```cpp -const void *ImmutableData() -``` - -获取 `Buffer` 只读缓存数据指针。 - -- 返回值 - - 返回值为只读缓存数据指针。 - -#### InvalidateBuffer - -```cpp -Status InvalidateBuffer() -``` - -使当前主机上的 Buffer 数据无效化。 - -- 返回值 - - 返回值状态码为 `K_OK` 时表示无效化成功,否则返回其他错误码。 - -## CreateParam - -\#include <[datasystem/object_cache/object_client.h](../../../../include/datasystem/object_cache/object_client.h)> - -CreateParam 类用于配置对象的相关属性,当前定义如下: - -```cpp -struct CreateParam { - WriteMode writeMode = WriteMode::NONE_L2_CACHE; - ConsistencyType consistencyType = ConsistencyType::PRAM; -}; -``` - -详细参数解释见 [WriteMode](#writemode) 和 [ConsistencyType](#consistencytype) 章节。 - -## WriteMode - -\#include <[datasystem/object_cache/object_enum.h](../../../../include/datasystem/object_cache/object_enum.h)> - -WriteMode 类用于配置对象可靠性,当前定义如下: - -```cpp -enum class WriteMode : int { - NONE_L2_CACHE = 0, - WRITE_THROUGH_L2_CACHE = 1, - WRITE_BACK_L2_CACHE = 2, - NONE_L2_CACHE_EVICT = 3, -}; -``` - -目前,支持以下 `WriteMode`: -|定义| 说明 | -|----|--------------------------------------| -|`WriteMode.NONE_L2_CACHE` | 对象仅写入到缓存中。默认配置| -|`WriteMode.WRITE_THROUGH_L2_CACHE` | 对象同步写入缓存和二级缓存中。| -|`WriteMode.WRITE_BACK_L2_CACHE` | 对象同步写入缓存,异步写入二级缓存中。| -|`WriteMode.NONE_L2_CACHE_EVICT` | 对象是易失性的,如果缓存资源缺乏,对象可能会提前退出生命周期。| - - -## ConsistencyType - -\#include <[datasystem/object_cache/object_enum.h](../../../../include/datasystem/object_cache/object_enum.h)> - -WriteMode 类用于配置对象一致性,当前定义如下: - -```cpp -enum class ConsistencyType : int { - PRAM = 0, - CAUSAL = 1, -}; - -``` - -目前,支持以下 `ConsistencyType`: -|定义| 说明 | -|----|--------------------------------------| -|`ConsistencyType.PRAM` | PRAM 一致性。| -|`ConsistencyType.CAUSAL` | 因果一致性。| - -## enum CacheType -\#include <[datasystem/object_cache/object_enum.h](../../../../include/datasystem/object_cache/object_enum.h)> - -CacheType 类用于配置对象保存位置,当前定义如下: - -```cpp -enum class CacheType : int { - MEMORY = 0, - DISK = 1, -}; - -``` - -目前,支持以下 `CacheType`: -|定义| 说明 | -|----|--------------------------------------| -|`CacheType.MEMORY` | 保存到内存| -|`CacheType.DISK` | 保存到磁盘| diff --git a/docs/source_zh_cn/conf.py b/docs/source_zh_cn/conf.py deleted file mode 100644 index ed5675b61296b3baadf24ca758af7a74dd7dfcf3..0000000000000000000000000000000000000000 --- a/docs/source_zh_cn/conf.py +++ /dev/null @@ -1,174 +0,0 @@ -# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import glob -import os -import re -import shutil -import sys -from sphinx.ext import autodoc as sphinx_autodoc -import sphinx.ext.autosummary.generate as g - -sys.path.append(os.path.abspath('../_ext')) -from myautosummary import DsCnAutoSummary - -# Fix some dl-label lack class='simple' -from docutils.writers import _html_base - -with open(_html_base.__file__, "r", encoding="utf-8") as f: - code_str = f.read() - old_str = ''' if self.is_compactable(node): - classes.append('simple')''' - new_str = ''' if classes == []: - classes.append('simple')''' - code_str = code_str.replace(old_str, new_str) - exec(code_str, _html_base.__dict__) - -# -- Project information ----------------------------------------------------- - -project = 'openYuanrong datasystem' -copyright = 'openYuanrong datasystem' -author = 'openYuanrong datasystem' - -# The full version, including alpha/beta/rc tags -release = 'master' - -# -- General configuration --------------------------------------------------- - -html_static_path = [os.path.abspath('../_static')] - -html_css_files = [ - 'custom.css', -] - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -myst_enable_extensions = ["dollarmath", "amsmath", "colon_fence"] - -myst_heading_anchors = 5 -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.autosummary', - 'sphinx.ext.doctest', - 'sphinx.ext.intersphinx', - 'sphinx.ext.todo', - 'sphinx.ext.coverage', - 'sphinx.ext.napoleon', - 'sphinx.ext.mathjax', - 'IPython.sphinxext.ipython_console_highlighting', - 'myst_parser', - 'sphinx_design', -] - -source_suffix = { - '.rst': 'restructuredtext', - '.md': 'markdown', -} - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -mathjax_path = 'https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/mathjax/MathJax-3.2.2/es5/tex-mml-chtml.js' - -mathjax_options = { - 'async':'async' -} - -nbsphinx_requirejs_path = 'https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js' - -nbsphinx_requirejs_options = { - "crossorigin": "anonymous", - "integrity": "sha256-1fEPhSsRKlFKGfK3eO710tEweHh1fwokU5wFGDHO+vg=" -} - -smartquotes_action = 'De' - -exclude_patterns = [] - -pygments_style = 'sphinx' - -autodoc_inherit_docstrings = False - -autosummary_generate = True - -autosummary_generate_overwrite = False - -html_search_language = 'zh' - -# -- Options for HTML output ------------------------------------------------- - -# Reconstruction of sphinx auto generated document translation. - -language = 'zh_CN' -locale_dirs = ['../../../../resource/locale/'] -gettext_compact = False - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_rtd_theme' - -# Modify regex for sphinx.ext.autosummary.generate.find_autosummary_in_lines. -gfile_abs_path = os.path.abspath(g.__file__) -autosummary_re_line_old = r"autosummary_re = re.compile(r'^(\s*)\.\.\s+autosummary::\s*')" -autosummary_re_line_new = r"autosummary_re = re.compile(r'^(\s*)\.\.\s+(ms[a-z]*)?autosummary::\s*')" -with open(gfile_abs_path, "r+", encoding="utf8") as f: - data = f.read() - data = data.replace(autosummary_re_line_old, autosummary_re_line_new) - exec(data, g.__dict__) - -# Modify default signatures for autodoc. -autodoc_source_path = os.path.abspath(sphinx_autodoc.__file__) -autodoc_source_re = re.compile(r'stringify_signature\(.*?\)') -get_param_func_str = r"""\ -import re -import inspect as inspect_ - -def get_param_func(func): - try: - source_code = inspect_.getsource(func) - if func.__doc__: - source_code = source_code.replace(func.__doc__, '') - all_params_str = re.findall(r"def [\w_\d\-]+\(([\S\s]*?)(\):|\) ->.*?:)", source_code) - if "@classmethod" in source_code: - all_params = re.sub("(self|cls)(,|, )?", '', all_params_str[0][0].replace("\n", "")) - else: - all_params = re.sub("(self)(,|, )?", '', all_params_str[0][0].replace("\n", "")) - return all_params - except: - return '' - -def get_obj(obj): - if isinstance(obj, type): - return obj.__init__ - - return obj -""" - -with open(autodoc_source_path, "r+", encoding="utf8") as f: - code_str = f.read() - code_str = autodoc_source_re.sub('"(" + get_param_func(get_obj(self.object)) + ")"', code_str, count=0) - exec(get_param_func_str, sphinx_autodoc.__dict__) - exec(code_str, sphinx_autodoc.__dict__) - - - -def setup(app): - app.add_directive('dscnautosummary', DsCnAutoSummary) - app.add_config_value('rst_files', set(), False) - diff --git a/docs/source_zh_cn/getting-started/image/introduction.png b/docs/source_zh_cn/getting-started/image/introduction.png deleted file mode 100644 index f20528db3c434ba1a145bc33824b814b3653bc00..0000000000000000000000000000000000000000 Binary files a/docs/source_zh_cn/getting-started/image/introduction.png and /dev/null differ diff --git a/docs/source_zh_cn/getting-started/image/logo-large.png b/docs/source_zh_cn/getting-started/image/logo-large.png deleted file mode 100644 index a0338c5022ed3654abe8ee22d37131b2b7ed059d..0000000000000000000000000000000000000000 Binary files a/docs/source_zh_cn/getting-started/image/logo-large.png and /dev/null differ diff --git a/docs/source_zh_cn/getting-started/overview.md b/docs/source_zh_cn/getting-started/overview.md deleted file mode 100644 index d836e19e1e0f348c00335a6580ee6d154e4b495d..0000000000000000000000000000000000000000 --- a/docs/source_zh_cn/getting-started/overview.md +++ /dev/null @@ -1,78 +0,0 @@ -# 入门 - -openYuanrong datasystem 是一个分布式缓存系统,利用计算集群的 HBM/DRAM/SSD 资源构建近计算多级缓存,提升模型训练及推理、大数据、微服务等场景数据访问性能。 - -## 整体架构 - -![](./image/logical_architecture.png) - -openYuanrong datasystem 由三个部分组成: - -- **多语言SDK**:提供 Python/C++ 语言接口,封装 heterogeneous object/KV/object 多种语义,支撑业务实现数据快速读写。 - - **heterogeneous object**:基于 NPU 卡的 HBM 内存抽象异构对象接口,实现昇腾 NPU 卡间数据高速直通传输。同时提供 H2D/D2H 高速迁移接口,实现数据快速在 DRAM/HBM 之间传输。 - - **KV**:基于共享内存实现免拷贝的 KV 数据读写,实现高性能数据缓存,支持通过对接外部组件提供数据可靠性语义。 - - **object**:基于 host 侧共享内存抽象数据对象,实现基于引用计数的生命周期管理,将共享内存封装为 buffer,提供指针直接读写。 - -- **worker**:openYuanron datasystem 的核心组件,用于管理 DRAM/SSD 及元数据,提供近计算缓存能力。 - - **共享内存免拷贝**:基于共享内存对外提供数据读写接口,避免 SDK 与 worker 间数据拷贝,提升性能。 - - **NPU 间并发通信**:通过异构对象抽象实现卡间直通通信,自动协调 NPU 间 HCCL 收发顺序,实现 NPU 卡间数据并发传输。 - - **P2P 数据分发**:大规模数据复制时,实现 P2P 传输负载均衡策略,允许由新的数据接收者提供数据,充分利用卡间链路带宽。 - - **元数据管理**:分布式元数据管理,实现系统水平线性扩展,避免单点瓶颈。支持元数据可靠性,提升集群可用性。提供数据订阅发布能力。 - - **多级缓存淘汰置换**:支持基于 LRU 的多级缓存置换淘汰,热数据在内存,暖数据在磁盘,冷数据在二级缓存。 - - **数据管理**:提供引用计数,TTL 等多种数据生命周期管理能力。控制数据读写一致性,提供多种一致性能力。管理各节点数据副本,热点数据多副本缓存,提升读取效率。 - -- **集群管理**:依赖 ETCD,实现节点发现/健康检测,支持故障恢复及在线扩缩容。 - -![](./image/deployment.png) - -openYuanrong datasystem 的部署视图(如上图所示): - -- 需部署 ETCD 用于集群管理。 -- 每个节点需部署 worker 进程并注册到 ETCD。 -- SDK 集成到用户进程中并与同节点的 worker 通信。 - -数据传输协议: - -- SDK 与 worker 之间通过共享内存读写数据。 -- worker 和 worker 之间通过 TCP/RDMA 传输数据(当前版本仅支持 TCP,后续版本支持 RDMA)。 -- 异构对象 HBM 之间通过 HCCS/RoCE 卡间直通传输数据。 - -# 快速开始 - -## 安装部署 - -openYuanrong datasystem 提供了 pip install 及源码安装两种方式,详细请参考[安装指南](install.md)。 -openYuanrong datasystem 提供了两种部署方式: - -- [快速进程部署](deploy.md#openyuanrong-datasystem进程部署) -- [在 Kubernetes上部署](deploy.md#openyuanrong-datasystem-kubernetes部署) - -## 开发指南 - -### 异构对象 - -异构对象实现对 HBM 内存的抽象管理,能够高效实现 D2D/H2D/D2H 的数据传输,加速 AI 训推场景数据读写。 - -主要应用场景 - -- **LLM 长序列推理 KVCache**:基于异构对象提供分布式多级缓存 (HBM/DRAM/SSD) 和高吞吐 D2D/H2D/D2H 访问能力,构建分布式 KV Cache,实现 Prefill 阶段的 KVCache 缓存以及 Prefill/Decode 实例间 KV Cache 快速传递,提升推理吞吐。 -- **模型推理实例 M->N 快速弹性**:利用异构对象的卡间直通及 P2P 数据分发能力实现模型参数快速复制。 -- **训练场景 CheckPoint 快速加载到 HBM**:各节点将待恢复的 Checkpoint 分片加载到异构对象中,利用异构对象的卡间直通传输及 P2P 数据分发能力,快速将 Checkpoint 传递到各节点 HBM。 - -[异构对象开发指南](../development-guide/hetero.md) - -### KV - -基于共享内存实现免拷贝的 KV 数据读写,支持通过对接外部组件提供数据可靠性语义,支持数据在 DRAM / SSD / 二级缓存之间置换,实现大容量高性能缓存。 - -主要应用场景 - -- **训练场景 Checkpoint 快速保存及加载**:基于 KV 接口快速读写 Checkpoint,并支持将数据持久化到二级缓存保证数据可靠性。 - -[KV开发指南](../development-guide/kv.md) - -### Object - -基于共享内存实现 Object 语义读写,提供基于引用计数管理生命周期,将共享内存抽象为 buffer,直接映射共享内存指针,提供更底层灵活的编程接口。 - -[Object开发指南](../development-guide/object.md) \ No newline at end of file diff --git a/docs/source_zh_cn/index.rst b/docs/source_zh_cn/index.rst deleted file mode 100644 index b30d72247776a3b78ed858a0dd505aa64d1054f4..0000000000000000000000000000000000000000 --- a/docs/source_zh_cn/index.rst +++ /dev/null @@ -1,81 +0,0 @@ -openYuanrong datasystem文档 -========================================= - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: 概述 - :hidden: - - getting-started/overview - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: 安装教程 - :hidden: - - getting-started/install - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: 部署教程 - :hidden: - - getting-started/deploy - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: 开发指南 - :hidden: - - development-guide/hetero - development-guide/kv - development-guide/object - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: Python API - :hidden: - - api/api_python/ds_client/datasystem.DsClient - api/api_python/hetero_client/datasystem.hetero_client.HeteroClient - api/api_python/hetero_client/datasystem.hetero_client.Future - api/api_python/hetero_client/datasystem.hetero_client.DeviceBlobList - api/api_python/hetero_client/datasystem.hetero_client.Blob - api/api_python/hetero_client/datasystem.hetero_client.MetaInfo - api/api_python/ds_tensor_client/datasystem.DsTensorClient - api/api_python/kv_client/datasystem.kv_client.KVClient - api/api_python/kv_client/datasystem.kv_client.ReadOnlyBuffer - api/api_python/kv_client/datasystem.kv_client.ReadParam - api/api_python/kv_client/datasystem.kv_client.SetParam - api/api_python/object_client/datasystem.object_client.Buffer - api/api_python/object_client/datasystem.object_client.ObjectClient - api/api_python/object_client/datasystem.object_client.ConsistencyType - api/api_python/object_client/datasystem.object_client.WriteMode - - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: C++ API - :hidden: - - api/api_cpp/dsclient - api/api_cpp/hetero_cache - api/api_cpp/kv_cache - api/api_cpp/object_cache - api/api_cpp/common - -.. toctree:: - :glob: - :maxdepth: 1 - :caption: 附录 - :hidden: - - appendix/dscli - appendix/k8s_configuration - appendix/log_guide \ No newline at end of file diff --git a/docs/zh-cn/latest/html/.buildinfo b/docs/zh-cn/latest/html/.buildinfo new file mode 100644 index 0000000000000000000000000000000000000000..433b283d435847117c26667d595b2515f426d3b0 --- /dev/null +++ b/docs/zh-cn/latest/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 5f5953a711490dbc49fc6369295aa8ea +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/source_zh_cn/getting-started/image/deployment.png b/docs/zh-cn/latest/html/_images/deployment.png similarity index 100% rename from docs/source_zh_cn/getting-started/image/deployment.png rename to docs/zh-cn/latest/html/_images/deployment.png diff --git a/docs/source_zh_cn/getting-started/image/logical_architecture.png b/docs/zh-cn/latest/html/_images/logical_architecture.png similarity index 100% rename from docs/source_zh_cn/getting-started/image/logical_architecture.png rename to docs/zh-cn/latest/html/_images/logical_architecture.png diff --git a/docs/zh-cn/latest/html/_sources/appendix/index.md b/docs/zh-cn/latest/html/_sources/appendix/index.md new file mode 100644 index 0000000000000000000000000000000000000000..98a4fc9d973a62f02cbd8692c9847a188bd952e1 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/appendix/index.md @@ -0,0 +1,11 @@ +# 附录 + +```{eval-rst} +.. toctree:: + :hidden: + + log_guide.md +``` + +附录包含以下内容: +- [openYuanrong datasystem 日志指南](log_guide.md) \ No newline at end of file diff --git a/docs/source_zh_cn/appendix/log_guide.md b/docs/zh-cn/latest/html/_sources/appendix/log_guide.md similarity index 93% rename from docs/source_zh_cn/appendix/log_guide.md rename to docs/zh-cn/latest/html/_sources/appendix/log_guide.md index 8e57579324c9fdc3080efedcc695f0d1aeb62abf..60c6dbbf479b92659054c4025f9ddfb3debe4080 100644 --- a/docs/source_zh_cn/appendix/log_guide.md +++ b/docs/zh-cn/latest/html/_sources/appendix/log_guide.md @@ -51,19 +51,19 @@ openYuanrong datasystem 不同模块日志分类如下表所示: | datasize | 16 | 记录Publish请求接收到的Payload大小。 | | request param | 2560 | 记录该请求的关键请求参数,最大长度2048。请参考“关键请求参数”表格。 | | response param | 1024 | 记录该请求的响应信息。最大长度为1024 Byte,超出则截断。 | -| shm_info | 47 | 记录共享内存使用信息,单位为Byte,按照1T限制大小,每个长度 13 Byte,格式为:memoryUsage/physicalMemoryUsage/totalLimit/rate
    1) memoryUsage 已分配的内存大小,是已缓存的对象大小总和。
    2) physicalMemoryUsage 已分配的物理内存大小。
    3) totalLimit 共享内存总大小。
    4) Rate 共享内存使用率,memoryUsage/totalLimit, 保留3位有效数字,单位: %. | -| spill_disk_inf0 | 47 | 记录Spill磁盘使用信息。单位为Byte,按照1T限制大小,每个长度 13 Byte,格式为:spaceUsage/physicalSpaceUsage/totalLimit/rate
    1) spaceUsage 已使用的磁盘大小,是已Spill的对象大小总和。
    2) physicalSpaceUsage 已使用的物理磁盘大小。
    3) totalLimit Spill磁盘总大小。
    4) Rate Spill磁盘使用率,spaceUsage /totalLimit, 保留3位有效数字,单位: %. | -| client nums | 5 | 记录已和worker成功建立连接的Client数。最大值为10000. | -| object nums | 9 | 记录worker已缓存对象数。按照1亿对象限制数量。 | -| object total datasize | 13 | 记录worker已缓存对象的大小。按照1T限制大小,长度 13 Byte | -| WorkerOcService threadpool | 21 | WorkerOcService threadpool使用信息,线程数限制最大128;格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate
    1) idelNum 空闲线程数;
    2) currentTotalNum 当前正在运行任务的线程数;
    3) MaxThreadNum threadpool最大可申请的线程数;
    4) waitingTaskNum 正在等待的任务数。
    5) rate 线程利用率,currentTotalNum/ MaxThreadNum,单位:%,保留3位有效数字。 | -| WorkerWorkerOcService threadpool | 21 | threadpool使用信息 | -| MasterWokrerOcService threadpool | 21 | threadpool使用信息 | +| shm_info | 47 | 记录共享内存使用信息,单位为Byte,按照1T限制大小,每个长度 13 Byte,格式为:memoryUsage/physicalMemoryUsage/totalLimit/rate
    1) memoryUsage 已分配的内存大小,是已缓存的对象大小总和。
    2) physicalMemoryUsage 已分配的物理内存大小。
    3) totalLimit 共享内存总大小。
    4) Rate 共享内存使用率,memoryUsage/totalLimit, 保留3位有效数字,单位: %. | +| spill_disk_info | 47 | 记录Spill磁盘使用信息。单位为Byte,按照1T限制大小,每个长度 13 Byte,格式为:spaceUsage/physicalSpaceUsage/totalLimit/rate
    1) spaceUsage 已使用的磁盘大小,是已Spill的对象大小总和。
    2) physicalSpaceUsage 已使用的物理磁盘大小。
    3) totalLimit Spill磁盘总大小。
    4) Rate Spill磁盘使用率,spaceUsage /totalLimit, 保留3位有效数字,单位: %. | +| client nums | 5 | 记录已和worker成功建立连接的Client数。最大值为10000. | +| object nums | 9 | 记录worker已缓存对象数。按照1亿对象限制数量。| +| object total datasize | 13 | 记录worker已缓存对象的大小。按照1T限制大小,长度 13 Byte | +| WorkerOcService threadpool | 21 | WorkerOcService threadpool使用信息,线程数限制最大128;格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate
    1) idelNum 空闲线程数;
    2) currentTotalNum 当前正在运行任务的线程数;
    3) MaxThreadNum threadpool最大可申请的线程数;
    4) waitingTaskNum 正在等待的任务数。
    5) rate 线程利用率,currentTotalNum/ MaxThreadNum,单位:%,保留3位有效数字。| +| WorkerWorkerOcService threadpool | 21 | threadpool使用信息 | +| MasterWokrerOcService threadpool | 21 | threadpool使用信息 | | MasterOcService threadpool | 21 | threadpool使用信息 | -| write ETCD queue | 15 | 队列使用信息 | -| ETCDrequest success rate | 6 | 请求使用率,单位 %,保留3位有效数字 | -| OBSrequest success rate | 6 | 请求使用率,单位 %,保留3位有效数字 | -| Master AsyncTask threadpool | 21 | threadpool使用信息,格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate | +| write ETCD queue | 15 | 队列使用信息 | +| ETCDrequest success rate | 6 | 请求使用率,单位 %,保留3位有效数字 | +| OBSrequest success rate | 6 | 请求使用率,单位 %,保留3位有效数字 | +| Master AsyncTask threadpool | 21 | threadpool使用信息,格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate | #### SDK与worker访问日志关键请求参数 diff --git a/docs/zh-cn/latest/html/_sources/contributor_guide/contribution.md b/docs/zh-cn/latest/html/_sources/contributor_guide/contribution.md new file mode 100644 index 0000000000000000000000000000000000000000..e9db19eb3d878b58ba44ce1359f987173c762e20 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/contributor_guide/contribution.md @@ -0,0 +1,20 @@ +# 贡献者指南 + +我们欢迎您对 openYuanrong 做各种形式的贡献,包括但不限于: + +- 代码贡献:提交或检视补丁,补充测试用例等。 +- 非代码贡献:补充文档和示例,参与社区论坛,撰写教程、博客文章等。 + +openYuanrong 是 openEuler 社区中的项目。参与社区贡献前,您需要提前签署 [openEuler 社区贡献者许可协议(CLA)](https://clasign.osinfra.cn/sign/gitee_openeuler-1611298811283968340){target="_blank"}。 + +## 提交或处理 Issue + +我们使用 issue 来记录和追踪开发者的反馈及任务。您可以在项目主页点击工具栏中的“Issues”找到 Issue 列表,上报 Bug 或者提交需求请参考 [Issue 提交指南](https://gitee.com/openeuler/community/blob/master/zh/contributors/issue-submit.md){target="_blank"}。 + +您可以对感兴趣的 Issue 发表自己的意见,参与交流和讨论。如果愿意处理某个 Issue,只需要在评论框内输入 /assign 或 /assign @yourself,机器人就会将问题分配给您,您的名字将显示在负责人列表里。 + +## 如何工作 + +请参考以下内容了解如何贡献代码。 + +- 参考[源码编译 openYuanrong datasystem](../installation/installation_linux.md#源码编译安装) 构建您的代码开发环境。 diff --git a/docs/source_zh_cn/getting-started/deploy.md b/docs/zh-cn/latest/html/_sources/deployment/deploy.md similarity index 92% rename from docs/source_zh_cn/getting-started/deploy.md rename to docs/zh-cn/latest/html/_sources/deployment/deploy.md index c35b04c77bcc61b836774a46225c02493dd64acf..98b3944f5fa9ff9a543ac4ed7489761f6766d891 100644 --- a/docs/source_zh_cn/getting-started/deploy.md +++ b/docs/zh-cn/latest/html/_sources/deployment/deploy.md @@ -1,4 +1,4 @@ -# 部署openYuanrong datasystem +# 部署 openYuanrong datasystem - [openYuanrong datasystem进程部署](#openyuanrong-datasystem进程部署) @@ -29,8 +29,8 @@ openYuanrong datasystem进程部署所需的系统环境依赖如下: |软件名称|版本|作用| |-------|----|----| | openEuler |22.03|运行openYuanrong datasystem的操作系统| -|[CANN](#安装cann)|8.0.0或8.0.rc2|运行异构相关特性的依赖库| -|[Python](#安装python)|3.10-3.11|openYuanrong datasystem dscli的使用依赖Python环境| +|[CANN](#安装cann)|8.2.rc1|运行异构相关特性的依赖库| +|[Python](#安装python)|3.9-3.11|openYuanrong datasystem dscli的使用依赖Python环境| |[dscli](#安装dscli)|-|用于部署openYuanrong datasystem的命令行工具| |[ETCD](#安装并部署etcd)|3.5|openYuanrong datasystem集群管理依赖组件| |[SSH互信配置](#ssh互信配置)|-|仅多机部署需要,配置SSH互信用于机器间互相访问| @@ -38,21 +38,26 @@ openYuanrong datasystem进程部署所需的系统环境依赖如下: 下面给出以上依赖的安装方法。 ### 安装CANN -在[Ascend官网](https://www.hiascend.com/hardware/firmware-drivers/community?product=1&model=30&cann=8.0.0.beta1&driver=Ascend+HDK+24.1.RC3)下载CANN run包,安装 run 包: +CANN的安装依赖Python环境,请确保您在开始安装CANN之前环境中的Python已经就绪。 + +在[Ascend官网](https://www.hiascend.com/developer/download/community/result?module=cann&cann=8.2.RC1)下载CANN run包,安装 run 包: ```bash -./Ascend-cann-toolkit__linux-.run --install +chmod +x ./Ascend-cann-toolkit__linux-.run +./Ascend-cann-toolkit__linux-.run --install --quiet ``` -执行以上命令会打屏华为企业业务最终用户许可协议(EULA)的条款和条件,请输入Y或y同意协议,继续安装流程。 安装完成后,若显示如下信息,则说明软件安装成功: ```bash -xxx install success +Toolkit: Ascend-cann-toolkit__linux- install success ``` -xxx表示安装的实际软件包名。 -如果用户未指定安装路径,则软件会安装到默认路径下,默认安装路径如下。root用户:"/usr/local/Ascend",非root用户:"\${HOME}/Ascend",${HOME}为当前用户目录。 +如果用户未指定安装路径,则软件会安装到默认路径下,默认安装路径如下: +| 用户身份 | 默认路径 | +| ------ | ------------------- | +| root | `/usr/local/Ascend` | +| 非 root | `$HOME/Ascend` | -配置环境变量,以非root用户安装后的默认路径为例,请用户根据set_env.sh的实际路径执行如下命令: +加载环境变量(非 root 示例): ```bash source ${HOME}/Ascend/ascend-toolkit/set_env.sh ``` @@ -87,7 +92,7 @@ python --version ``` ### 安装dscli -dscli命令行工具集成在openYuanrong datasystem的wheel包 `openyuanrong_datasystem--cp311-cp311-manylinux_2_34_.whl`中,安装openYuanrong datasystem请参考[安装openYuanrong datasystem](install.md)。 +dscli命令行工具集成在openYuanrong datasystem的wheel包 `openyuanrong_datasystem--cp311-cp311-manylinux_2_34_.whl`中,安装openYuanrong datasystem请参考[安装openYuanrong datasystem](../installation/installation_linux.md)。 安装完成后,运行如下命令: ```bash @@ -207,7 +212,7 @@ openYuanrong datasystem集群依赖ETCD,部署前需要先部署ETCD,部署E ``` 输出OK说明部署成功。 - 更多快速部署的使用方式请参考:[dscli单机快速部署](../appendix/dscli.md#单机部署) + 更多快速部署的使用方式请参考:[dscli单机快速部署](../deployment/dscli.md#单机部署) - 通过配置项部署 @@ -223,7 +228,7 @@ openYuanrong datasystem集群依赖ETCD,部署前需要先部署ETCD,部署E ``` 输出OK说明部署成功。 - 更多配置项部署的使用方式请参考:[dscli单机配置项部署](../appendix/dscli.md#单机部署) + 更多配置项部署的使用方式请参考:[dscli单机配置项部署](../deployment/dscli.md#单机部署) #### 多机部署 @@ -272,7 +277,7 @@ dscli up -f ./cluster_config.json > - 需要部署的机器上都已安装dscli,dscli安装可参考:[安装dscli](#安装dscli)。 > -更多配置项部署的使用方式请参考:[dscli多机部署](../appendix/dscli.md#多机部署) +更多配置项部署的使用方式请参考:[dscli多机部署](../deployment/dscli.md#多机部署) ### 快速验证 @@ -372,7 +377,7 @@ openYuanrong datasystem Kubernetes部署所需的依赖如下: - 源码编译构建镜像 - 如果需要从源码构建镜像,需要先完成 [源码编译](install.md)。源码编译完成之后执行如下命令: + 如果需要从源码构建镜像,需要先完成 [源码编译](../installation/installation_linux.md)。源码编译完成之后执行如下命令: ```bash cd yuanrong-datasystem/docker @@ -455,7 +460,7 @@ kubectl get pods -o wide 当Pod处于Running状态时说明Pod处于就绪状态,可以正常对外提供服务,部署成功。 -更多部署参数配置请参考:[Kubernetes配置项](../appendix/k8s_configuration.md) +更多部署参数配置请参考:[Kubernetes配置项](../deployment/k8s_configuration.md) ### 快速验证 diff --git a/docs/source_zh_cn/appendix/dscli.md b/docs/zh-cn/latest/html/_sources/deployment/dscli.md similarity index 96% rename from docs/source_zh_cn/appendix/dscli.md rename to docs/zh-cn/latest/html/_sources/deployment/dscli.md index 38215ec9805480875fc8e1c364805e7c02a6edfd..154bac8a21d54b5720882aa8d4db43df6a3938bf 100644 --- a/docs/source_zh_cn/appendix/dscli.md +++ b/docs/zh-cn/latest/html/_sources/deployment/dscli.md @@ -20,9 +20,9 @@ - [dscli stop](#dscli-stop) - [dscli up](#dscli-up) - [dscli down](#dscli-down) - - [dscli generate_helm_chart](#dscli-generatehelmchart) - - [dscli generate_cpp_template](#dscli-generatecpptemplate) - - [dscli generate_config](#dscli-generateconfig) + - [dscli generate_helm_chart](#dscli-generate_helm_chart) + - [dscli generate_cpp_template](#dscli-generate_cpp_template) + - [dscli generate_config](#dscli-generate_config) - [dscli collect_log](#dscli-collect_log) - [dscli runscript](#dscli-runscript) - [配置项说明](#配置项说明) @@ -32,7 +32,7 @@ -[![查看源文件](https://Mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/openeuler/yuanrong-datasystem/blob/master/docs/source_zh_cn/appendix/dscli.md) +[![查看源文件](https://Mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/openeuler/yuanrong-datasystem/blob/master/docs/source_zh_cn/deployment/dscli.md) 本文档介绍dscli集群管理工具的使用方法、命令行参数以及配置项说明。 @@ -220,7 +220,7 @@ pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/${version}/yr_da ### 源码编译安装 -源码编译安装 openYuanrong datasystem 详细说明请参考:[源码编译方式安装openYuanrong datasystem](../getting-started/install.md#源码编译安装)。 +源码编译安装 openYuanrong datasystem 详细说明请参考:[源码编译方式安装openYuanrong datasystem](../installation/installation_linux.md#源码编译安装)。 ## dscli使用教程 @@ -229,7 +229,7 @@ pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/${version}/yr_da ### openYuanrong datasystem集群部署 -openYuanrong datasystem集群管理依赖ETCD,在部署openYuanrong datasystem集群前请确保ETCD集群处于可用状态。ETCD部署教程可参考:[ETCD集群部署](../getting-started/deploy.md#安装并部署ETCD)。 +openYuanrong datasystem集群管理依赖ETCD,在部署openYuanrong datasystem集群前请确保ETCD集群处于可用状态。ETCD部署教程可参考:[ETCD集群部署](../deployment/deploy.md#安装并部署etcd)。 #### 单机部署 @@ -449,7 +449,7 @@ openYuanrong datasystem单机卸载依赖 [dscli stop](#dscli-stop) 命令: ### 生成Helm Chart模板 -通过 [dscli generate_helm_chart](#dscli-generatehelmchart) 命令在当前目录生成 openYuanrong datasystem 的 Helm Chart 包: +通过 [dscli generate_helm_chart](#dscli-generate_helm_chart) 命令在当前目录生成 openYuanrong datasystem 的 Helm Chart 包: ```bash dscli generate_helm_chart @@ -471,13 +471,13 @@ helm install yr_datasystem /home/sn/datasystem-helm-chart/datasystem helm uninstall yr_datasystem ``` -更多 openYuanrong datasystem Kubernetes 部署详细信息请参考:[openYuanrong datasystem Kubernetes部署](../getting-started/deploy.md#openyuanrong-datasystem-kubernetes部署)。 +更多 openYuanrong datasystem Kubernetes 部署详细信息请参考:[openYuanrong datasystem Kubernetes部署](../deployment/deploy.md#openyuanrong-datasystem-kubernetes部署)。 -更多关于 dscli generate_helm_chart 命令的使用请参考:[dscli generate_helm_chart](#dscli-generatehelmchart)。 +更多关于 dscli generate_helm_chart 命令的使用请参考:[dscli generate_helm_chart](#dscli-generate_helm_chart)。 ### 生成Cpp样例代码 -通过 [dscli generate_cpp_template](#dscli-generatecpptemplate) 命令可快速生成 openYuanrong datasystem 的 C++ 样例代码: +通过 [dscli generate_cpp_template](#dscli-generate_cpp_template) 命令可快速生成 openYuanrong datasystem 的 C++ 样例代码: ```bash dscli generate_cpp_template @@ -506,13 +506,13 @@ bash run.sh ### 日志收集 -通过 [dscli collect_log](#dscli-collectlog) 命令可快速收集节点上的日志: +通过 [dscli collect_log](#dscli-collect_log) 命令可快速收集节点上的日志: ```bash dscli collect_log --cluster_config_path ./cluster_config.json ``` -更多关于 dscli generate_helm_chart 命令的使用请参考:[dscli collect_log](#dscli-collectlog)。 +更多关于 dscli generate_helm_chart 命令的使用请参考:[dscli collect_log](#dscli-collect_log)。 ### 多机命令运行 @@ -527,7 +527,7 @@ dscli collect_log --cluster_config_path ./cluster_config.json EOF ``` -2. 设置集群配置信息 `cluster_config.json`,可通过 [dscli generate_config](#dscli-generateconfig) 命令生成并修改,其中 `worker_nodes` 即为要执行脚本的机器: +2. 设置集群配置信息 `cluster_config.json`,可通过 [dscli generate_config](#dscli-generate_config) 命令生成并修改,其中 `worker_nodes` 即为要执行脚本的机器: ```json { diff --git a/docs/zh-cn/latest/html/_sources/deployment/index.md b/docs/zh-cn/latest/html/_sources/deployment/index.md new file mode 100644 index 0000000000000000000000000000000000000000..cd55c842f133810e30966783f324ecaeaa8b0b26 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/deployment/index.md @@ -0,0 +1,15 @@ +# 部署 + +```{eval-rst} +.. toctree:: + :hidden: + + deploy.md + dscli.md + k8s_configuration.md +``` + +本节向您介绍如何部署 openYuanrong datasystem: +- [部署 openYuanrong datasystem](deploy.md) +- [dscli命令行工具详细介绍](dscli.md) +- [Kubernetes详细配置项](k8s_configuration.md) \ No newline at end of file diff --git a/docs/source_zh_cn/appendix/k8s_configuration.md b/docs/zh-cn/latest/html/_sources/deployment/k8s_configuration.md similarity index 99% rename from docs/source_zh_cn/appendix/k8s_configuration.md rename to docs/zh-cn/latest/html/_sources/deployment/k8s_configuration.md index 3392ad604ccec3037e6aa9a7cd630617b9952d77..97df359a18681ea08626896f3d81824023b1a69f 100644 --- a/docs/source_zh_cn/appendix/k8s_configuration.md +++ b/docs/zh-cn/latest/html/_sources/deployment/k8s_configuration.md @@ -25,7 +25,7 @@ -[![查看源文件](https://Mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/openeuler/yuanrong-datasystem/blob/master/docs/source_zh_cn/appendix/k8s_configuration.md) +[![查看源文件](https://Mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/master/resource/_static/logo_source.svg)](https://gitee.com/openeuler/yuanrong-datasystem/blob/master/docs/source_zh_cn/deployment/k8s_configuration.md) 本文档描述了openYuanrong datasystem Kubernetes快速启动以及详细配置项说明。 @@ -52,7 +52,7 @@ global: etcdAddress: "127.0.0.1:2379" ``` -部署openYuanrong datasystem请参考:[openYuanrong datasystem Kubernetes部署](../getting-started/deploy.md#openyuanrong-datasystem-kubernetes部署)。 +部署openYuanrong datasystem请参考:[openYuanrong datasystem Kubernetes部署](../deployment/deploy.md#openyuanrong-datasystem-kubernetes部署)。 默认情况下,每个 openYuanrong datasystem DaemonSet 最大可使用 2GB 共享内存空间用于缓存数据,如果需要调整该值,可以通过 [global.resources.datasystemWorker.sharedMemory](#资源相关配置) 调整。 diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/Buffer.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/Buffer.rst new file mode 100644 index 0000000000000000000000000000000000000000..789332d6b4c4f67375a9f662b5c8add3abdbe360 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/Buffer.rst @@ -0,0 +1,97 @@ +Buffer +==================== + +.. cpp:class:: Buffer + + :header-file: #include + :namespace: datasystem + + 用于表示共享内存数据的类。 + + **公共函数** + + .. cpp:function:: Buffer() + + 默认构造类,创建一个空的 Buffer。 + + 返回: + 默认 ``Buffer`` 实例。 + + .. cpp:function:: Buffer(Buffer &&other) noexcept + + 移动构造函数。 + + 返回: + 移动构造后的 ``Buffer`` 实例。 + + .. cpp:function:: ~Buffer() = default + + 默认析构函数。 + + .. cpp:function:: void *GetData() + + 获取 ``Buffer`` 可读写的缓存数据指针。 + + 返回: + 可读写的缓存数据指针。 + + .. cpp:function:: int64_t GetSize() const + + 获取键值对 ``Buffer`` 的大小。 + + 返回: + ``Buffer`` 大小(以字节为单位)。 + + .. cpp:function:: Status WLatch(uint64_t timeoutSec = 60) + + 对 ``Buffer`` 添加写锁。 + + .. note:: + 仅在涉及单节点多实例同时访问的场景才需要加锁进行数据保护,否则无需在访问共享内存的数据前对其加锁。 + + 参数: + - **timeoutSec** - 添加写锁的超时时间,默认为 60 秒。 + + 返回: + 返回值状态码为 `K_OK` 时表示加写锁成功,否则返回其他错误码。 + + .. cpp:function:: Status UnWLatch() + + 对 ``Buffer`` 解除写锁。 + + 返回: + 返回值状态码为 `K_OK` 时表示加写锁成功,否则返回其他错误码。 + + .. cpp:function:: Status RLatch(uint64_t timeoutSec = 60) + + 对 ``Buffer`` 添加读锁。 + + .. note:: + 仅在涉及单节点多实例同时访问的场景才需要加锁进行数据保护,否则无需在访问共享内存的数据前对其加锁。 + + 参数: + - **timeoutSec** - 添加写锁的超时时间,默认为 60 秒。 + + 返回: + 返回值状态码为 `K_OK` 时表示加写锁成功,否则返回其他错误码。 + + .. cpp:function:: Status UnRLatch() + + 对 ``Buffer`` 解除读锁。 + + 返回: + 返回值状态码为 `K_OK` 时表示加写锁成功,否则返回其他错误码。 + + .. cpp:function:: Status MemoryCopy(const void *data, uint64_t length) + + 将数据拷贝到 `Buffer` 的缓存。该函数具备多线程并行拷贝的能力,同时能拷贝超过 2GB 的连续内存地址。 + + 参数: + - **data** - 需要拷贝的数据内存地址。 + - **length** - 需要拷贝的数据长度。 + + 返回: + 返回值状态码为 `K_OK` 时表示数据拷贝成功,否则返回其他错误码。 + + + \ No newline at end of file diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/KVClient.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/KVClient.rst new file mode 100644 index 0000000000000000000000000000000000000000..5545da5747ab494dead0ed6590e4d0be756cc95e --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/KVClient.rst @@ -0,0 +1,247 @@ +KVClient +==================== + +.. cpp:class:: KVClient + + :header-file: #include + :namespace: datasystem + + KV缓存客户端。 + + **公共函数** + + .. cpp:function:: KVClient(const ConnectOptions &connectOptions) + + 构造KV缓存客户端实例。 + + 参数: + - **connectOptions** - 配置连接选项,包括IP地址和端口,详见 cpp:class:`ConnectOptions` 章节 + + 返回: + KV缓存客户端实例。 + + .. cpp:function:: ~KVClient() + + 析构KV缓存客户端实例,析构过程中会自动断开与 Worker 的连接,释放客户端持有的资源。 + + .. cpp:function:: Status Init() + + 建立与数据系统 Worker 之间的连接并完成初始化。 + + 返回: + 返回值状态码为 StatusCode::K_OK 时表示初始化成功,否则返回其他错误码。 + + .. cpp:function:: Status ShutDown() + + 断开与数据系统 Worker 之间的连接。 + + 返回: + 返回值状态码为 StatusCode::K_OK 时表示断链成功,否则返回其他错误码。 + + + .. cpp:function:: Status Create(const std::string &key, uint64_t size, const SetParam ¶m, std::shared_ptr &buffer) + + 创建数据系统共享内存Buffer,可以将数据拷贝到Buffer中,再调用Set接口缓存到数据系统中。该接口应用于避免创建临时内存,减少内存拷贝的场景。 + + 参数: + - **key** - 需要设置的key。key的合法字符为:英文字母(a-zA-Z)、数字以及 ``-_!@#%^*()+=:;``,最大长度为255字节。 + - **size** - 需要创建的共享内存Buffer的大小,以字节为单位。 + - **param** - 设置参数,详见 :cpp:class:`SetParam` 章节。 + - **buffer** - 传出参数,表示创建好的共享内存 :cpp:class:`Buffer` 。 + + 返回: + 返回值状态码为 `K_OK` 时表示设置成功,否则返回其他错误码。 + + .. cpp:function:: Status Set(const std::shared_ptr &buffer) + + 将共享内存数据缓存到数据系统。 + + 参数: + - **buffer** - 共享内存 :cpp:class:`Buffer` 。 + + 返回值 + 返回值状态码为 `K_OK` 时表示设置成功,否则返回其他错误码。 + + .. cpp:function:: Status Set(const std::string &key, const StringView &val, const SetParam ¶m) + + 设置键值对数据缓存到数据系统。 + + 参数: + - **key** - 键,key的合法字符为:英文字母(a-zA-Z)、数字以及 ``-_!@#%^*()+=:;``,最大长度为255字节. + - **val** - 需要缓存的值. + - **param** - 设置参数,详见 :cpp:class:`SetParam` 章节。 + + 返回: + 返回值状态码为 `K_OK` 时表示设置成功,否则返回其他错误码。 + + .. cpp:function:: Status MCreate(const std::vector &keys, const std::vector &sizes, const SetParam ¶m, std::vector> &buffers) + + 创建数据系统共享内存Buffer,可以将数据拷贝到Buffer中,再调用Set接口缓存到数据系统中。该接口应用于避免创建临时内存,减少内存拷贝的场景。 + + 参数: + - **keys** - 需要设置的一组key. key的合法字符为:英文字母(a-zA-Z)、数字以及 ``·-_!@#%^*()+=:;``,单个key最大长度为255字节. key的最大个数为10,000,推荐单次设置的key个数小于等于64个。 + - **sizes** - 设置共享内存Buffer的大小,以字节为单位. 该数组长度需要与 ``keys`` 的长度相等。 + - **param** - 设置参数,详见 :cpp:class:`SetParam` 章节。 + - **buffers** - 传出参数,表示创建好的共享内存 :cpp:class:`Buffer` 数组,该数组的长度与 `keys` 相等,索引位置一一对应,即每个 ``buffers[i]`` 的值与 ``keys[i]`` 相对应。 + + 返回: + 返回值状态码为 `K_OK` 时表示设置成功,否则返回其他错误码。 + + .. cpp:function:: Status MSet(const std::vector> &buffers) + + 键值对批量设置接口。与 :cpp:func:`Status MCreate(const std::vector &keys, const std::vector &sizes, const SetParam ¶m, std::vector> &buffers)` 接口相互配合使用,用于批量将共享内存 :cpp:class:`Buffer` 缓存到数据系统中。 + + 参数: + - **buffers** - 需要缓存到数据系统的共享内存 :cpp:class:`Buffer` 数组。 + + 返回: + 返回值状态码为 `K_OK` 时表示设置成功,否则返回其他错误码。 + + .. cpp:function:: Status MSet(const std::vector &keys, const std::vector &vals, std::vector &outFailedKeys, const SetParam ¶m) + + 键值对批量设置接口。可批量设置键值对并返回失败的键。 + + 参数: + - **keys** - 需要设置的一组key. key的合法字符为:英文字母(a-zA-Z)、数字以及 ``-_!@#%^*()+=:;``,单个key最大长度为255字节. key的最大个数为10,000,推荐单次设置的key个数小于等于64个。 + - **vals** - 需要设置的一组key对应的value. 该数组长度需要与 ``keys`` 的长度相等。 + - **outFailedKeys** - 传出参数,代表设置失败的key。 + - **param** - 设置参数,详见 :cpp:class:`SetParam` 章节。 + + 返回: + 返回值状态码为 `K_OK` 时表示设置成功,否则返回其他错误码。 + + .. cpp:function:: Status Get(const std::string &key, std::string &val, int32_t subTimeoutMs) + + 获取键对应的数据。 + + 参数: + - **key** - 键. key的合法字符为:英文字母(a-zA-Z)、数字以及 ``-_!@#%^*()+=:;``,单个key最大长度为255字节。 + - **val** - 传出参数,返回缓存数据。 + - **subTimeoutMs** - 支持订阅不存在的数据,subTimeoutMs表示订阅等待的时长,单位ms。不允许为负数,默认值为0表示不等待。 + + 返回: + - 返回 ``StatusCode::K_OK`` 表示获取成功。 + - 返回 ``StatusCode::K_INVALID`` 表示 ``key`` 校验不通过。 + - 返回 ``StatusCode::K_NOT_FOUND`` 表示 ``key`` 不存在。 + - 返回 ``StatusCode::K_RPC_UNAVAILABLE`` 时表示请求遇到了网络错误。 + - 返回 ``StatusCode::K_RUNTIME_ERROR`` 表示 worker 侧存在错误。 + + .. cpp:function:: Status Get(const std::string &key, Optional &buffer, int32_t subTimeoutMs) + + 获取键对应的共享内存 :cpp:class:`Buffer` 。该接口相比 :cpp:func:`Status Get(const std::string &key, std::string &val, int32_t subTimeoutMs)` 可减少一次从共享内存到临时内存的拷贝,直接读取缓存在共享内存上的数据,性能更优。 + + 参数: + - **key** - 键. key的合法字符为:英文字母(a-zA-Z)、数字以及 ``-_!@#%^*()+=:;`` ,单个key最大长度为255字节。 + - **subTimeoutMs** - 支持订阅不存在的数据,subTimeoutMs表示订阅等待的时长,单位ms。不允许为负数,默认值为0表示不等待。 + - **buffer** - 传出参数,返回的使用 :cpp:class:`Optional` 封装的共享内存 :cpp:class:`Buffer` ,当 Get 返回失败时,``buffer`` 的值为` ``nullptr``。 + + 返回: + - 返回 ``StatusCode::K_OK`` 表示获取成功。 + - 返回 ``StatusCode::K_INVALID`` 表示 ``key`` 校验不通过。 + - 返回 ``StatusCode::K_NOT_FOUND`` 表示 ``key`` 不存在。 + - 返回 ``StatusCode::K_RPC_UNAVAILABLE`` 时表示请求遇到了网络错误。 + - 返回 ``StatusCode::K_RUNTIME_ERROR`` 表示 worker 侧存在错误。 + + + .. cpp:function:: Status Get(const std::vector &keys, std::vector &vals, int32_t subTimeoutMs) + + 批量获取数据。 + + 参数: + - **keys** - 需要获取的一组key. key的合法字符为:英文字母(a-zA-Z)、数字以及 ``-_!@#%^*()+=:;`` ,单个key最大长度为255字节。传入的key的个数不能超过1万,推荐单次获取key个数小于等于64个。 + - **subTimeoutMs** - 支持订阅不存在的数据,subTimeoutMs表示订阅等待的时长,单位ms。不允许为负数,默认值为0表示不等待。 + - **vals** - 传出参数,返回一组获取的数据。若有部分数据获取不成功,则对应位置的vector的对象为空。 + + 返回: + - 返回 ``StatusCode::K_OK`` 表示至少有一个数据获取成功。 + - 返回 ``StatusCode::K_INVALID`` 表示存在key校验不通过。 + - 返回 ``StatusCode::K_RPC_UNAVAILABLE`` 时表示请求遇到了网络错误。 + - 返回 ``StatusCode::K_NOT_FOUND`` 表示所有`keys`不存在。 + - 返回 ``StatusCode::K_RUNTIME_ERROR`` 表示 worker 侧存在错误。 + + + .. cpp:function:: Status Get(const std::vector &keys, std::vector> &buffers, int32_t subTimeoutMs) + + 批量获取多个键对应的共享内存 :cpp:class:`Buffer` 。该接口相比 :cpp:func:`Status Get(const std::vector &keys, std::vector &vals, int32_t subTimeoutMs)` 少一次从共享内存到临时内存的拷贝,性能更优。 + + 参数: + - **keys** - 需要获取的一组key. key的合法字符为:英文字母(a-zA-Z)、数字以及 ``-_!@#%^*()+=:;`` ,单个key最大长度为255字节。传入的key的个数不能超过1万,推荐单次获取key个数小于等于64个。 + - **subTimeoutMs** - 支持订阅不存在的数据,subTimeoutMs表示订阅等待的时长,单位ms。不允许为负数,默认值为0表示不等待。 + - **buffers** - 传出参数,返回的一组使用 :cpp:class:`Optional` 封装的共享内存 :cpp:class:`Buffer` 。若有部分数据获取不成功,则对应位置的vector的对象为空。 + + 返回: + - 返回 ``StatusCode::K_OK`` 表示至少有一个数据获取成功。 + - 返回 ``StatusCode::K_INVALID`` 表示存在key校验不通过。 + - 返回 ``StatusCode::K_RPC_UNAVAILABLE`` 时表示请求遇到了网络错误。 + - 返回 ``StatusCode::K_NOT_FOUND`` 表示所有`keys`不存在。 + - 返回 ``StatusCode::K_RUNTIME_ERROR`` 表示 worker 侧存在错误。 + + .. cpp:function:: Status Del(const std::string &key) + + 删除指定键值对。key不存在时视为删除成功。 + + 参数: + - **key** - 键. key的合法字符为:英文字母(a-zA-Z)、数字以及 ``-_!@#%^*()+=:;`` ,单个key最大长度为255字节。 + + 返回: + 返回值状态码为 `K_OK` 时表示初始化成功,否则返回其他错误码。 + + .. cpp:function:: Status Del(const std::vector &keys, std::vector &failedKeys) + + 批量删除指定键值对。key不存在时视为删除成功。 + + 参数: + - **keys** - 需要获取的一组key. key的合法字符为:英文字母(a-zA-Z)、数字以及 ``-_!@#%^*()+=:;`` ,单个key最大长度为255字节。传入的key的个数不能超过1万,推荐单次获取key个数小于等于64个。 + - **failedKeys** - 传出参数,返回删除失败的key。 + + 返回: + - 返回 ``StatusCode::K_OK`` 表示至少有一个数据删除成功。 + - 返回 ``StatusCode::K_INVALID`` 表示存在key校验不通过。 + - 返回值状态码为 ``StatusCode::K_RPC_UNAVAILABLE`` 时表示请求遇到了网络错误。 + - 返回 ``StatusCode::K_RUNTIME_ERROR`` 表示 worker 侧存在错误。 + + .. cpp:function:: std::future DelAll() + + 异步删除集群中所有的键值对。 + + 返回: + ``future`` 代表 ``DelAll`` 操作的未来结果,可以通过 ``std::future::get()`` 函数获取异步结果。 + + .. cpp:function:: Status HealthCheck() + + 检查连接的 Worker 是否健康。 + + 返回: + 返回值状态码为 `K_OK` 时表示 Worker 健康,否则返回其他错误码。 + + .. cpp:function:: Status KVClient::Exist(const std::vector &keys, std::vector &exists) + + 批量查询一组键(keys)是否存在,并返回每个键的存在性状态。支持最多10000个键的查询。 + + 参数: + - **keys** - 待查询的键列表,最大支持10000个键。 + - **exists** - 传出参数,返回每个键的存在性状态。 + + 返回: + - 返回 ``StatusCode::K_OK`` 表示查询成功。 + - 返回 ``StatusCode::K_INVALID`` 表示提供的键中包含非法字符或为空。 + - 返回 ``StatusCode::K_RPC_UNAVAILABLE`` 表示请求遇到了网络错误。 + - 返回 ``StatusCode::K_NOT_READY`` 表示服务当前无法处理请求。 + - 返回 ``StatusCode::K_RUNTIME_ERROR`` 表示 worker 侧存在错误。 + + .. cpp:function:: Status Expire(const std::vector &keys, uint32_t ttlSeconds, std::vector &failedKeys) + + 批量为一组键(keys)更新过期生命周期(ttlSeconds),并返回更新失败的键(failedKeys)。最多支持 10000 个键的查询。 + + 参数: + - **keys** - 待更新生命周期的键列表。 + - **ttlSeconds** - 为键设置的新的生命周期,单位为秒。 + - **failedKeys** - 传出参数,返回操作失败的键。 + + 返回: + - 返回 ``StatusCode::K_OK`` 表示至少有一个键设置生命周期成功。 + - 返回 ``StatusCode::K_INVALID`` 表示提供的键中包含非法字符或为空。 + - 返回 ``StatusCode::K_NOT_FOUND`` 表示所有`keys`不存在。 + - 返回 ``StatusCode::K_RPC_UNAVAILABLE`` 表示请求遇到了网络错误。 + - 返回 ``StatusCode::K_NOT_READY`` 表示服务当前无法处理请求。 + - 返回 ``StatusCode::K_RUNTIME_ERROR`` 表示 worker 侧存在错误。 \ No newline at end of file diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/Optional.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/Optional.rst new file mode 100644 index 0000000000000000000000000000000000000000..728166a76c45f0aa669a38ee73208863e78948a2 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/Optional.rst @@ -0,0 +1,60 @@ +Optional +========================== + +.. cpp:class:: Optional + + :header-file: #include + :namespace: datasystem + + 用于表示一个值可能存在,当值不存在时表示为 null。 + + **公共函数** + + .. cpp:function:: constexpr Optional() + + 默认构造函数。 + + 返回: + ``Optional`` 实例。 + + .. cpp:function:: Optional(const Optional &) + + 拷贝构造函数。 + + 返回: + ``Optional`` 实例。 + + .. cpp:function:: Optional &operator=(const Optional &) + + 拷贝构造函数。 + + 返回: + ``Optional`` 实例。 + + .. cpp:function:: Optional(Optional &&other) noexcept + + 移动构造函数。 + + 返回: + ``Optional`` 实例。 + + .. cpp:function:: Optional &operator=(Optional &&) noexcept + + 移动构造函数。 + + 返回: + ``Optional`` 实例。 + + .. cpp:function:: template explicit Optional(Args &&... args); + + 构造函数。 + + 参数: + - **args** - 构造入参。 + + 返回: + ``Optional`` 实例。 + + .. cpp:function:: ~Optional() + + 析构函数 \ No newline at end of file diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/SensitiveValue.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/SensitiveValue.rst new file mode 100644 index 0000000000000000000000000000000000000000..c3ef6082253ecd77b1a16978ea4408647f933933 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/SensitiveValue.rst @@ -0,0 +1,85 @@ +SensitiveValue +========================== + +.. cpp:class:: SensitiveValue + + :header-file: #include + :namespace: datasystem + + 用于保存敏感信息的类。 + + **公共函数** + + .. cpp:function:: SensitiveValue() = default + + 默认构造函数。 + + .. cpp:function:: SensitiveValue(const char *str) + + 拷贝传入字符串指针上的敏感数据并构造实例。 + + 参数: + - **str** - 需要读取的字符串指针。 + + .. cpp:function:: SensitiveValue(const std::string &str) + + 拷贝传入字符串的敏感数据并构造实例。 + + 参数: + - **str** - 需要读取的字符串。 + + .. cpp:function:: SensitiveValue(const char *str, size_t size) + + 拷贝传入字符串指针上的敏感数据并构造实例。 + + 参数: + - **str** - 需要读取的字符串指针。 + - **size** - 需要读取的大小。 + + .. cpp:function:: SensitiveValue(std::unique_ptr data, size_t size); + + 拷贝传入数据指针上的敏感数据并构造实例。 + + 参数: + - **data** - 需要读取的数据指针。 + - **size** - 需要读取的大小。 + + .. cpp:function:: ~SensitiveValue() + + 析构函数,析构时会释放保存的敏感数据。 + + .. cpp:function:: bool Empty() const + + 判断是否为空实例,即不包含任何敏感数据。 + + 返回: + 如果返回为 ``true``,表明该实例内不包含敏感数据。 + + .. cpp:function:: const char *GetData() const + + 获取敏感数据的内存地址。 + + 返回: + 敏感数据内存地址。 + + .. cpp:function:: size_t GetSize() const + + 获取敏感数据的大小。 + + 返回: + 敏感数据大小。 + + .. cpp:function:: bool MoveTo(std::unique_ptr &outData, size_t &outSize) + + 将实例内的敏感数据移动到传入的 ``outData`` 中,该过程不涉及敏感数据的拷贝。 + + 参数: + - **outData** - 用于接收敏感数据的智能指针。 + - **outSize** - 敏感数据的大小。 + + 返回: + ``true`` 表示移动成功。 + + .. cpp:function:: void Clear() + + 清理实例内的敏感数据, \ No newline at end of file diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/Status.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/Status.rst new file mode 100644 index 0000000000000000000000000000000000000000..d10c7307d4d641132b7285af1ba73290db9b4215 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/Status.rst @@ -0,0 +1,123 @@ +Status +==================== + +.. cpp:class:: Status + + :header-file: #include + :namespace: datasystem + + Status 类用于表示请求/方法的执行结果。 + + **公共函数** + + .. cpp:function:: Status() noexcept + + 默认构造类,创建一个空的 Status 实例,表示 OK。 + + 返回: + 默认 ``Status`` 实例。 + + .. cpp:function:: Status(const Status &other) + + 构造函数。 + + 返回: + 构造后的 ``Status`` 实例。 + + .. cpp:function:: Status(Status &&other) noexcept + + 移动构造函数。 + + 返回: + 移动构造后的 ``Status`` 实例。 + + .. cpp:function:: Status(StatusCode code, std::string msg) + + 构造函数,根据 StatusCode 和 ``msg`` 构造 ``Status`` 实例。 + + 参数: + - **code** - 错误码。 + - **msg** - 错误信息。 + + 返回: + ``Status`` 实例。 + + .. cpp:function:: Status(StatusCode code, int lineOfCode, const std::string &fileName, const std::string &extra = "") + + 构造函数,根据 StatusCode、``lineOfCode``、``filenName`` 以及 ``extra`` 构造 ``Status`` 实例。 + + 参数: + - **code** - 错误码。 + - **lineOfCode** - 文件行号。 + - **filenName** - 文件名。 + - **extra** - 额外的报错信息。 + + 返回: + ``Status`` 实例。 + + .. cpp:function:: ~Status() noexcept + + 默认析构函数。 + + .. cpp:function:: static Status OK() + + 返回状态码为 ``K_OK`` 的 ``Status`` 实例。 + + 返回: + 状态码为 `K_OK` 的 ``Status`` 实例。 + + .. cpp:function:: std::string ToString() const + + 返回 Status 的状态码和报错信息。 + + 返回: + Status 的状态码和报错信息。 + + .. cpp:function:: StatusCode GetCode() const + + 返回 Status 的状态码。 + + 返回: + Status 的状态码。 + + .. cpp:function:: std::string GetMsg() + + 返回 Status 的报错信息。 + + 返回: + Status 的报错信息。 + + .. cpp:function:: void AppendMsg(const std::string &appendMsg) + + 拼接 Status 的报错信息。 + + 参数: + - **appendMsg** - 需要拼接的报错信息。 + + .. cpp:function:: bool IsOk() const + + 判断 Status 的状态码是否为 ``K_OK``。 + + 返回: + ``true`` 表示 Status 的状态码为 ``K_OK``。 + + .. cpp:function:: bool IsError() const + + 判断 Status 的状态码是否为非 ``K_OK`` 错误码。 + + 返回: + ``true`` 表示 Status 的状态码为非 ``K_OK`` 错误码。 + + .. cpp:function:: static std::string StatusCodeName(StatusCode code) + + 获取状态码的字符串表示,多用于打印需求。 + + 参数: + - **code** - 状态码。 + + 返回: + 状态码的字符串表示。 + + + + \ No newline at end of file diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/StringView.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/StringView.rst new file mode 100644 index 0000000000000000000000000000000000000000..d9f80fca262f8e160e22720ece6a14cf9e853cb0 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/StringView.rst @@ -0,0 +1,71 @@ +StringView +==================== + +.. cpp:class:: StringView + + :header-file: #include + :namespace: datasystem + + 字符串视图类,主要用于高效地传递和访问字符串数据,而无需复制或分配内存。 + + **公共函数** + + .. cpp:function:: constexpr StringView() noexcept + + 默认构造函数,构造一个空字符串视图实例。 + + 返回: + ``StringView`` 实例。 + + .. cpp:function:: constexpr StringView(const char *str) + + 保存字符串指针上的并构造实例,这个过程不会发生拷贝。 + + 参数: + - **str** - 需要保存的字符串指针。 + + 返回: + ``StringView`` 实例。 + + .. cpp:function:: constexpr StringView(const char *str, size_t len) + + 保存字符串指针上的并构造实例,这个过程不会发生拷贝。 + + 参数: + - **str** - 需要保存的字符串指针。 + - **len** - 字符串长度。 + + 返回: + ``StringView`` 实例。 + + .. cpp:function:: StringView(const std::string &str) + + 保存字符串的指针上与字符串大小并构造实例,这个过程不会发生拷贝。 + + 参数: + - **str** - 字符串。 + + .. cpp:function:: ~StringView() + + 默认析构函数。 + + .. cpp:function:: constexpr const char *data() const noexcept + + 获取 StringView 的数据指针。 + + 返回: + ``StringView`` 的数据指针。 + + .. cpp:function:: constexpr size_t size() const noexcept + + 获取 StringView 的数据大小。 + + 返回: + ``StringView`` 的数据大小。 + + .. cpp:function:: constexpr size_t empty() const noexcept + + 判断 StringView 是否为空。 + + 返回: + ``true`` 表示 ``StringView`` 为空。 \ No newline at end of file diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/enum-CacheType.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/enum-CacheType.rst new file mode 100644 index 0000000000000000000000000000000000000000..e593c489c83a5d85ce9557393ccdecd73de25556 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/enum-CacheType.rst @@ -0,0 +1,18 @@ +CacheType +======================================== + +.. cpp:class:: CacheType + + :header-file: #include + :namespace: datasystem + + `CacheType` 类定义对象的缓存介质。 + + 目前,支持以下 `CacheType`: + + =================================== ================================================================== + 定义 说明 + =================================== ================================================================== + `CacheType::MEMORY` 内存介质,数据将缓存在共享内存上。 + `CacheType::DISK` 磁盘介质,数据将缓存在磁盘上。 + =================================== ================================================================== diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/enum-ConsistencyType.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/enum-ConsistencyType.rst new file mode 100644 index 0000000000000000000000000000000000000000..095712bf8745614c224fff96f185fe64a3730e8b --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/enum-ConsistencyType.rst @@ -0,0 +1,18 @@ +ConsistencyType +======================================== + +.. cpp:class:: ConsistencyType + + :header-file: #include + :namespace: datasystem + + `ConsistencyType` 类定义对象的一致性配置。 + + 目前,支持以下 `ConsistencyType`: + + =================================== ================================================================== + 定义 说明 + =================================== ================================================================== + `ConsistencyType::PRAM` Pipeline RAM一致性。默认配置 + `ConsistencyType::CAUSAL` 因果一致性。 + =================================== ================================================================== diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/enum-StatusCode.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/enum-StatusCode.rst new file mode 100644 index 0000000000000000000000000000000000000000..d4c67fb55908da04e4cf0449ada74c0dadd3a40b --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/enum-StatusCode.rst @@ -0,0 +1,27 @@ +StatusCode +======================================== + +.. cpp:class:: StatusCode + + :header-file: #include + :namespace: datasystem + + `StatusCode` 类定义Status的状态码。 + + 目前,支持以下 `StatusCode`: + + =================================== ================================================================== + 定义 说明 + =================================== ================================================================== + `StatusCode::K_OK` 表示成功 + `StatusCode::K_INVALID` 表示入参检验失败 + `StatusCode::K_NOT_FOUND` 表示对象不存在 + `StatusCode::K_RUNTIME_ERROR` 表示运行时错误,多发生于内部错误 + `StatusCode::K_OUT_OF_MEMORY` 表示内存不足 + `StatusCode::K_NOT_AUTHORIZED` 表示认证鉴权失败 + `StatusCode::K_RPC_CANCELLED` 表示请求的连接通道被意外关闭 + `StatusCode::K_RPC_UNAVAILABLE` 表示请求发生超时 + `StatusCode::K_ACL_ERROR` 表示发生了ACL相关的错误 + `StatusCode::K_HCCL_ERROR` 表示发生了HCCL相关的错误 + `StatusCode::K_URMA_ERROR` 表示发生了URMA相关的错误 + =================================== ================================================================== diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/enum-WriteMode.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/enum-WriteMode.rst new file mode 100644 index 0000000000000000000000000000000000000000..a452f67596cb9357092cf12a96936e7bc9a6ff87 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/enum-WriteMode.rst @@ -0,0 +1,18 @@ +WriteMode +========================== + +.. cpp:class:: WriteMode + + :header-file: #include + :namespace: datasystem + + 配置数据可靠性级别的枚举类。 + + =================================== ================================================================== + 定义 说明 + =================================== ================================================================== + `WriteMode::NONE_L2_CACHE` 对象仅写入到缓存中。默认配置 + `WriteMode::WRITE_THROUGH_L2_CACHE` 对象同步写入缓存和二级缓存中。 + `WriteMode::WRITE_BACK_L2_CACHE` 对象同步写入缓存,异步写入二级缓存中。 + `WriteMode::NONE_L2_CACHE_EVICT` 对象是易失性的,如果缓存资源缺乏,对象可能会提前退出生命周期。 + =================================== ================================================================== diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/index.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..84b293c2058859193a74db0da1aa8242e7b30f7e --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/index.rst @@ -0,0 +1,56 @@ +C++ +============================== + +.. toctree:: + :glob: + :hidden: + :maxdepth: 1 + + KVClient + Buffer + struct-ConnectOptions + struct-SetParam + enum-WriteMode + enum-ConsistencyType + enum-CacheType + SensitiveValue + StringView + Optional + Status + enum-StatusCode + +KV接口 +----------------------------------- + +.. list-table:: + :widths: 30 70 + :header-rows: 0 + + * - :cpp:func:`KVClient::KVClient` + - 构造KV缓存客户端实例。 + * - :cpp:func:`KVClient::~KVClient` + - 析构KV缓存客户端实例,析构过程中会自动断开与 Worker 的连接,释放客户端持有的资源。 + * - :cpp:func:`KVClient::Init` + - 建立与数据系统 Worker 之间的连接并完成初始化。 + * - :cpp:func:`KVClient::ShutDown` + - 断开与数据系统 Worker 之间的连接。 + * - :cpp:func:`KVClient::Create` + - 创建数据系统共享内存Buffer,可以将数据拷贝到Buffer中,再调用Set接口缓存到数据系统中。 + * - :cpp:func:`KVClient::Set` + - 将共享内存数据缓存到数据系统。 + * - :cpp:func:`KVClient::MCreate` + - 创建数据系统共享内存Buffer,可以将数据拷贝到Buffer中,再调用Set接口缓存到数据系统中。 + * - :cpp:func:`KVClient::MSet` + - 键值对批量设置接口。 + * - :cpp:func:`KVClient::Get` + - 获取键对应的数据。 + * - :cpp:func:`KVClient::Del` + - 删除指定键值对。 + * - :cpp:func:`KVClient::DelAll` + - 异步删除集群中所有的键值对。 + * - :cpp:func:`KVClient::HealthCheck` + - 检查连接的 Worker 是否健康。 + * - :cpp:func:`KVClient::Exist` + - 批量查询一组键(keys)是否存在。 + * - :cpp:func:`KVClient::Expire` + - 批量为一组键(keys)更新过期生命周期。 \ No newline at end of file diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/struct-ConnectOptions.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/struct-ConnectOptions.rst new file mode 100644 index 0000000000000000000000000000000000000000..1a9b4c34c8591edbed72fff3cd5c0c4327e5f6df --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/struct-ConnectOptions.rst @@ -0,0 +1,62 @@ +ConnectOptions +========================== + +.. cpp:class:: ConnectOptions + + :header-file: #include + :namespace: datasystem + + 用于配置对象客户端的初始化参数的结构体。 + + **公共成员** + + .. cpp:member:: std::string host + + 数据系统 Worker 的主机 IP 地址。 + + .. cpp:member:: int32_t port + + 数据系统 Worker 的主机 IP 端口号。 + + .. cpp:member:: int32_t connectTimeoutMs = 60 * 1000; + + 客户端连接和请求超时时间,单位为毫秒。默认值:60'000。 + + .. cpp:member:: std::string clientPublicKey = ""; + + 用于 curve 认证的客户端公钥。默认值:""。 + + .. cpp:member:: SensitiveValue clientPrivateKey = ""; + + 用于 curve 认证的客户端私钥。默认值:"" + + .. cpp:member:: std::string serverPublicKey = ""; + + 用于 curve 认证的服务端公钥。默认值:"" + + .. cpp:member:: std::string accessKey = ""; + + AK/SK 授权使用的访问密钥。默认值:"" + + .. cpp:member:: SensitiveValue secretKey = ""; + + AK/SK 授权的密钥。默认值:"" + + .. cpp:member:: std::string tenantId = ""; + + 租户 ID。默认值:"" + + .. cpp:member:: bool enableCrossNodeConnection = false; + + 如果为 true,允许客户端在与当前数据系统Worker 连接异常时自动切换到备用节点。默认值:false + + **公共函数** + + .. cpp:function:: void SetAkSkAuth(const std::string &accessKey, const SensitiveValue &secretKey, const std::string &tenantId) + + 设置 AK/SK 用于后续请求访问。 + + 参数: + - **accessKey** - 设置授权使用的访问密钥。 + - **accessKey** - 设置AK/SK 授权的密钥。 + - **tenantId** - 租户ID。 diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/struct-SetParam.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/struct-SetParam.rst new file mode 100644 index 0000000000000000000000000000000000000000..a0f49b79cd378a33f79f3c9ce841af99f9dd40f6 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/cpp/struct-SetParam.rst @@ -0,0 +1,23 @@ +SetParam +========================== + +.. cpp:class:: SetParam + + :header-file: #include + :namespace: datasystem + + 用于配置对象客户端的初始化参数的结构体。 + + **公共成员** + + .. cpp:member:: WriteMode writeMode = WriteMode::NONE_L2_CACHE + + 设置数据可靠性级别,默认不写入二级缓存。 + + .. cpp:member:: uint32_t ttlSecond = 0 + + 设置Key的存活时间,单位:秒。Key达到存活时间后系统自动将其删除。默认为0,表示不设置存活时间,Key会一直存在直到显式调用Del接口。注意:系统重启后存活时间计时将重新开始。 + + .. cpp:member:: CacheType cacheType = CacheType::MEMORY + + 配置缓存介质,默认为内存缓存介质。 diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/index.md b/docs/zh-cn/latest/html/_sources/development-guide/api/index.md new file mode 100644 index 0000000000000000000000000000000000000000..d8049a8f41b8a4f2776e4248c542308bf4f59ba9 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/index.md @@ -0,0 +1,16 @@ +# API + +```{eval-rst} +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + python/index + cpp/index +``` + +本节向您介绍开发openYuanrong datasystem的相关 API。 + +- [Python](./python/index.rst) +- [C++](./cpp/index.rst) \ No newline at end of file diff --git a/docs/source_zh_cn/api/api_python/ds_client/DsClient/datasystem.DsClient.hetero.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.hetero.rst similarity index 33% rename from docs/source_zh_cn/api/api_python/ds_client/DsClient/datasystem.DsClient.hetero.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.hetero.rst index 9179ea23ca035d6a888d367a82f15601363c56f5..be0101595a786c8753c2ec84a876bbc839ad6835 100644 --- a/docs/source_zh_cn/api/api_python/ds_client/DsClient/datasystem.DsClient.hetero.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.hetero.rst @@ -1,9 +1,9 @@ -datasystem.DsClient.hetero +datasystem.DsClient.hetero ========================== .. py:method:: datasystem.DsClient.hetero - 获取异构对象客户端。 + 获取异构对象客户端实例。 返回: - - **HeteroClient** - 返回异构对象客户端 :class:`datasystem.hetero_client.HeteroClient` 。 \ No newline at end of file + :class:`datasystem.hetero_client.HeteroClient` 异构对象客户端实例。 \ No newline at end of file diff --git a/docs/source_zh_cn/api/api_python/ds_client/DsClient/datasystem.DsClient.init.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.init.rst similarity index 88% rename from docs/source_zh_cn/api/api_python/ds_client/DsClient/datasystem.DsClient.init.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.init.rst index 635d0789f880e69c861c666186467603e69d6fd9..02c97be872ab5dfad17a26145451c78f0c81b76e 100644 --- a/docs/source_zh_cn/api/api_python/ds_client/DsClient/datasystem.DsClient.init.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.init.rst @@ -1,4 +1,4 @@ -datasystem.DsClient.init +datasystem.DsClient.init ======================== .. py:method:: datasystem.DsClient.init diff --git a/docs/source_zh_cn/api/api_python/ds_client/DsClient/datasystem.DsClient.kv.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.kv.rst similarity index 36% rename from docs/source_zh_cn/api/api_python/ds_client/DsClient/datasystem.DsClient.kv.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.kv.rst index 63cd71083f1973b4d15110b922a1d7288104b68f..452f985754504be960648171973fd7405148a34c 100644 --- a/docs/source_zh_cn/api/api_python/ds_client/DsClient/datasystem.DsClient.kv.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.kv.rst @@ -1,9 +1,9 @@ -datasystem.DsClient.kv +datasystem.DsClient.kv ====================== .. py:method:: datasystem.DsClient.kv - 获取 KV 客户端。 + 获取异构对象客户端实例。 返回: - - **KvClient** - 返回 KV 客户端 :class:`datasystem.kv_client.KVClient` 。 + :class:`datasystem.kv_client.KVClient` KV客户端实例。 \ No newline at end of file diff --git a/docs/source_zh_cn/api/api_python/ds_client/DsClient/datasystem.DsClient.object.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.object.rst similarity index 34% rename from docs/source_zh_cn/api/api_python/ds_client/DsClient/datasystem.DsClient.object.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.object.rst index e3d8ab584939aceb68090740de9f5b8e860f11e1..cdd9b242cd7edf930a524c1cdf3ddcc7e43604b2 100644 --- a/docs/source_zh_cn/api/api_python/ds_client/DsClient/datasystem.DsClient.object.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.object.rst @@ -1,9 +1,9 @@ -datasystem.DsClient.object +datasystem.DsClient.object ========================== .. py:method:: datasystem.DsClient.object - 获取 object 客户端。 + 获取异构对象客户端实例。 返回: - - **ObjectClient** - 返回 object 客户端 :class:`datasystem.object_client.ObjectClient`。 + :class:`datasystem.object_client.ObjectClient` KV客户端实例。 \ No newline at end of file diff --git a/docs/source_zh_cn/api/api_python/ds_client/datasystem.DsClient.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.rst similarity index 73% rename from docs/source_zh_cn/api/api_python/ds_client/datasystem.DsClient.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.rst index 1b4419ff906ca5d8e3d9188d5c170c35648f761c..f4f183f2fc28bfdba43daeb04ec7428feda54a9b 100644 --- a/docs/source_zh_cn/api/api_python/ds_client/datasystem.DsClient.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsClient.rst @@ -20,9 +20,24 @@ datasystem.DsClient 输出: DsClient -.. dscnautosummary:: - :toctree: DsClient - :nosignatures: + **方法**: + + .. list-table:: + :widths: 40 60 + :header-rows: 0 + + * - :doc:`init ` + - 初始化数据系统客户端 + * - :doc:`hetero ` + - 获取数据系统异构缓存客户端。 + * - :doc:`kv ` + - 获取数据系统KV缓存客户端。 + * - :doc:`object ` + - 获取数据系统对象缓存客户端。 + +.. toctree:: + :maxdepth: 1 + :hidden: datasystem.DsClient.init datasystem.DsClient.hetero diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.async_dev_delete.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.async_dev_delete.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.async_dev_delete.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.async_dev_delete.rst diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.async_mget_h2d.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.async_mget_h2d.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.async_mget_h2d.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.async_mget_h2d.rst diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.async_mset_d2h.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.async_mset_d2h.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.async_mset_d2h.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.async_mset_d2h.rst diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.delete.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.delete.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.delete.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.delete.rst diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.dev_delete.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.dev_delete.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.dev_delete.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.dev_delete.rst diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.dev_local_delete.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.dev_local_delete.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.dev_local_delete.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.dev_local_delete.rst diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.dev_mget.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.dev_mget.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.dev_mget.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.dev_mget.rst diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.dev_mset.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.dev_mset.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.dev_mset.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.dev_mset.rst diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.dev_recv.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.dev_recv.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.dev_recv.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.dev_recv.rst diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.dev_send.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.dev_send.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.dev_send.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.dev_send.rst diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.get_page_attn_layerwise_d2d.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.get_page_attn_layerwise_d2d.rst similarity index 96% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.get_page_attn_layerwise_d2d.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.get_page_attn_layerwise_d2d.rst index 39a55c88900573ff1937b91eb5ca9dfc432aadef..d72fa5f5a5403b57517b8a3be84410880f3183f4 100644 --- a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.get_page_attn_layerwise_d2d.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.get_page_attn_layerwise_d2d.rst @@ -1,5 +1,5 @@ datasystem.DsTensorClient.get_page_attn_layerwise_d2d -=================================================== +===================================================== .. py:method:: datasystem.DsTensorClient.get_page_attn_layerwise_d2d(keys, layer_tensors, block_ids) diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.init.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.init.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.init.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.init.rst diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.mget_h2d.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.mget_h2d.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.mget_h2d.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.mget_h2d.rst diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.mget_page_attn_blockwise_h2d.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.mget_page_attn_blockwise_h2d.rst similarity index 96% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.mget_page_attn_blockwise_h2d.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.mget_page_attn_blockwise_h2d.rst index 36e930e688dbfa1f651775d76adff113be7f2418..1327be86d3ed349809b78fdd9bdb3692efb3697b 100644 --- a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.mget_page_attn_blockwise_h2d.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.mget_page_attn_blockwise_h2d.rst @@ -1,5 +1,5 @@ datasystem.DsTensorClient.mget_page_attn_blockwise_h2d -============================================== +====================================================== .. py:method:: datasystem.DsTensorClient.mget_page_attn_blockwise_h2d(keys, layer_tensors, block_ids, sub_timeout_ms) diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.mset_d2h.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.mset_d2h.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.mset_d2h.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.mset_d2h.rst diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.mset_page_attn_blockwise_d2h.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.mset_page_attn_blockwise_d2h.rst similarity index 95% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.mset_page_attn_blockwise_d2h.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.mset_page_attn_blockwise_d2h.rst index c9086881fec2e7b39d3d21a4de3145b384fb31e7..4defa660624a2dc3f4a7b043b8ed379a1f4c28fa 100644 --- a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.mset_page_attn_blockwise_d2h.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.mset_page_attn_blockwise_d2h.rst @@ -1,5 +1,5 @@ datasystem.DsTensorClient.mset_page_attn_blockwise_d2h -============================================== +====================================================== .. py:method:: datasystem.DsTensorClient.mset_page_attn_blockwise_d2h(keys, layer_tensors, block_ids) diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.put_page_attn_layerwise_d2d.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.put_page_attn_layerwise_d2d.rst similarity index 96% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.put_page_attn_layerwise_d2d.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.put_page_attn_layerwise_d2d.rst index f70b85aad340fc7f0be93c5eda7c9dc19a022074..13be5371f08a928ddf56a26c20af7f04c9bcc9ac 100644 --- a/docs/source_zh_cn/api/api_python/ds_tensor_client/DsTensorClient/datasystem.DsTensorClient.put_page_attn_layerwise_d2d.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.put_page_attn_layerwise_d2d.rst @@ -1,5 +1,5 @@ datasystem.DsTensorClient.put_page_attn_layerwise_d2d -================================================= +===================================================== .. py:method:: datasystem.DsTensorClient.put_page_attn_layerwise_d2d(keys, layer_tensors, block_ids) diff --git a/docs/source_zh_cn/api/api_python/ds_tensor_client/datasystem.DsTensorClient.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.rst similarity index 36% rename from docs/source_zh_cn/api/api_python/ds_tensor_client/datasystem.DsTensorClient.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.rst index e4eebc6f5386ab671f5768512b900c53f63e6bdc..14c607f0fc5c7ab71f76dceba72470b5e9931612 100644 --- a/docs/source_zh_cn/api/api_python/ds_tensor_client/datasystem.DsTensorClient.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.DsTensorClient.rst @@ -17,9 +17,50 @@ datasystem.DsTensorClient 输出: DsTensorClient -.. dscnautosummary:: - :toctree: DsTensorClient - :nosignatures: + **方法**: + + .. list-table:: + :widths: 40 60 + :header-rows: 0 + + * - :doc:`init ` + - 初始化数据系统客户端。 + * - :doc:`mset_d2h ` + - 将 device 的数据写入到 host 中。 + * - :doc:`mget_h2d ` + - 从 host 中获取数据并写入 device 中。 + * - :doc:`async_mset_d2h ` + - 将 device 的数据写入到 host 中的异步接口。 + * - :doc:`async_mget_h2d ` + - 从 host 中获取数据并写入 device 中的异步接口。 + * - :doc:`delete ` + - 删除 host 中的 key。 + * - :doc:`dev_send ` + - 订阅发布到数据系统的异构对象,并接收数据写入 tensors。 + * - :doc:`dev_recv ` + - 将 device 上的内存发布为数据系统的异构对象,发布后的异构对象可通过 dev_recv 获取。 + * - :doc:`dev_mset ` + - 通过数据系统缓存 Device 上的数据。 + * - :doc:`dev_mget ` + - 获取 device 中的数据,并写入到 Tensor 中。 + * - :doc:`dev_local_delete ` + - 从数据系统删除本节点上此 key 的元数据,不再管理此 key 对应的 device 内存。 + * - :doc:`dev_delete ` + - 从数据系统删除此 key 的元数据,不再管理此 key 对应的 device 内存。 + * - :doc:`async_dev_delete ` + - 从数据系统删除此 key 的元数据的异步接口,删除成功后不再管理此 key 对应的 device 内存。 + * - :doc:`put_page_attn_layerwise_d2d ` + - 将 PagedAttention 的层级 Tensor 发布为数据系统的异构对象。发布后的异构对象可通过 get_page_attn_layerwise_d2d 获取。 + * - :doc:`get_page_attn_layerwise_d2d ` + - 根据 key 获取缓存在数据系统的 PagedAttention 的层级 Tensor。 + * - :doc:`mset_page_attn_blockwise_d2h ` + - 将 PagedAttention 的层级 Tensor 异步写入 Host 中。 + * - :doc:`mget_page_attn_blockwise_h2d ` + - 从 Host 中获取 PagedAttention 的层级 Tensor 并写入 Device 中。 + +.. toctree:: + :maxdepth: 1 + :hidden: datasystem.DsTensorClient.init datasystem.DsTensorClient.mset_d2h @@ -33,6 +74,7 @@ datasystem.DsTensorClient datasystem.DsTensorClient.dev_mget datasystem.DsTensorClient.dev_local_delete datasystem.DsTensorClient.dev_delete + datasystem.DsTensorClient.async_dev_delete datasystem.DsTensorClient.put_page_attn_layerwise_d2d datasystem.DsTensorClient.get_page_attn_layerwise_d2d datasystem.DsTensorClient.mset_page_attn_blockwise_d2h diff --git a/docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.Blob.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.Blob.rst similarity index 54% rename from docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.Blob.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.Blob.rst index e0b5a3ed7481cc7e9b1a130800729da03c554db0..aecea1f24ac76a0f3ffc22976e35dc5c44ce7fec 100644 --- a/docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.Blob.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.Blob.rst @@ -12,9 +12,20 @@ datasystem.hetero_client.Blob 输出: Blob -.. dscnautosummary:: - :toctree: Blob - :nosignatures: + **方法**: + + .. list-table:: + :widths: 40 60 + :header-rows: 0 + + * - :doc:`set_dev_ptr ` + - 指定 Device 内存指针地址。 + * - :doc:`set_size ` + - 指定 Device 内存地址空间大小。 + +.. toctree:: + :maxdepth: 1 + :hidden: datasystem.hetero_client.Blob.set_dev_ptr datasystem.hetero_client.Blob.set_size diff --git a/docs/source_zh_cn/api/api_python/hetero_client/Blob/datasystem.hetero_client.Blob.set_dev_ptr.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.Blob.set_dev_ptr.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/Blob/datasystem.hetero_client.Blob.set_dev_ptr.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.Blob.set_dev_ptr.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/Blob/datasystem.hetero_client.Blob.set_size.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.Blob.set_size.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/Blob/datasystem.hetero_client.Blob.set_size.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.Blob.set_size.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/DeviceBlobList/datasystem.hetero_client.DeviceBlobList.append_blob.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.DeviceBlobList.append_blob.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/DeviceBlobList/datasystem.hetero_client.DeviceBlobList.append_blob.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.DeviceBlobList.append_blob.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/DeviceBlobList/datasystem.hetero_client.DeviceBlobList.get_blob_list.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.DeviceBlobList.get_blob_list.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/DeviceBlobList/datasystem.hetero_client.DeviceBlobList.get_blob_list.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.DeviceBlobList.get_blob_list.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.DeviceBlobList.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.DeviceBlobList.rst similarity index 51% rename from docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.DeviceBlobList.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.DeviceBlobList.rst index d9f11e30820bbc38149813bf80c54f49fb060f3d..2aadd1e2aefed23388255fc371952188620f7e3a 100644 --- a/docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.DeviceBlobList.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.DeviceBlobList.rst @@ -12,9 +12,22 @@ datasystem.hetero_client.DeviceBlobList 输出: DeviceBlobList -.. dscnautosummary:: - :toctree: DeviceBlobList - :nosignatures: + **方法**: + + .. list-table:: + :widths: 40 60 + :header-rows: 0 + + * - :doc:`append_blob ` + - 添加一个 :class:`datasystem.hetero_client.Blob`, 即一段 Device 内存信息。 + * - :doc:`set_dev_idx ` + - 指定 DeviceBlobList 中内存归属的 NPU 卡的 ID。 + * - :doc:`get_blob_list ` + - 获取 :class:`datasystem.hetero_client.Blob` 列表。 + +.. toctree:: + :maxdepth: 1 + :hidden: datasystem.hetero_client.DeviceBlobList.append_blob datasystem.hetero_client.DeviceBlobList.set_dev_idx diff --git a/docs/source_zh_cn/api/api_python/hetero_client/DeviceBlobList/datasystem.hetero_client.DeviceBlobList.set_dev_idx.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.DeviceBlobList.set_dev_idx.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/DeviceBlobList/datasystem.hetero_client.DeviceBlobList.set_dev_idx.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.DeviceBlobList.set_dev_idx.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/Future/datasystem.hetero_client.Future.get.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.Future.get.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/Future/datasystem.hetero_client.Future.get.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.Future.get.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.Future.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.Future.rst similarity index 49% rename from docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.Future.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.Future.rst index eac1e5318bf49f5be6e682341a97fc605c3fce4d..d5427a6f697e4500aa38590a8736ea5f73b2ca89 100644 --- a/docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.Future.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.Future.rst @@ -8,8 +8,17 @@ datasystem.hetero_client.Future 输出: Future -.. dscnautosummary:: - :toctree: Future - :nosignatures: + **方法**: + + .. list-table:: + :widths: 40 60 + :header-rows: 0 + + * - :doc:`get ` + - 获取异步任务的执行结果。 + +.. toctree:: + :maxdepth: 1 + :hidden: datasystem.hetero_client.Future.get diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.async_dev_delete.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.async_dev_delete.rst new file mode 100644 index 0000000000000000000000000000000000000000..f96d0feb6ad8c72144a99480c86b53b4e1a786b5 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.async_dev_delete.rst @@ -0,0 +1,17 @@ +datasystem.hetero_client.HeteroClient.async_dev_delete +====================================================== + +.. py:method:: datasystem.hetero_client.HeteroClient.async_dev_delete(keys) + +异步接口,从数据系统删除此 key 的元数据,不再管理此 key 对应的 device 内存。可通过返回的Future查询删除结果。 + + async_dev_delete 与 dev_mset / dev_mget 接口配套使用。 + + 参数: + - **keys** (list) - host 的 key 列表。约束:传入的key的数量不能超过1万。 + + 返回: + - **Future** (Future) - 可通过该Future对象查询异步请求执行结果。当调用Future的get方法时,如果删除key存在部分失败,则返回失败的列表;如果全部失败,则抛出RuntimeError异常。 + + 异常: + - **TypeError** - 输入参数存在非法值。 \ No newline at end of file diff --git a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.async_mget_h2d.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.async_mget_h2d.rst similarity index 95% rename from docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.async_mget_h2d.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.async_mget_h2d.rst index 1c4ca79f25ec18ab9a169bb771da4cc834f9a14b..9d77c7b5de6698a97233d54413dc406c8aff021b 100644 --- a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.async_mget_h2d.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.async_mget_h2d.rst @@ -1,5 +1,5 @@ datasystem.hetero_client.HeteroClient.async_mget_h2d -============================================== +==================================================== .. py:method:: datasystem.hetero_client.HeteroClient.async_mget_h2d(keys, data_blob_list, sub_timeout_ms) diff --git a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.async_mset_d2h.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.async_mset_d2h.rst similarity index 95% rename from docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.async_mset_d2h.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.async_mset_d2h.rst index 9d44c3caea17df3c23928e0c81cac48a6508dc53..75e66795dea042e8105cfd35ad77c0d51eb67d00 100644 --- a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.async_mset_d2h.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.async_mset_d2h.rst @@ -1,5 +1,5 @@ datasystem.hetero_client.HeteroClient.async_mset_d2h -============================================== +==================================================== .. py:method:: datasystem.hetero_client.HeteroClient.async_mset_d2h(keys, data_blob_list, set_param) diff --git a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.delete.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.delete.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.delete.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.delete.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.dev_delete.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.dev_delete.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.dev_delete.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.dev_delete.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.dev_local_delete.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.dev_local_delete.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.dev_local_delete.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.dev_local_delete.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.dev_mget.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.dev_mget.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.dev_mget.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.dev_mget.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.dev_mset.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.dev_mset.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.dev_mset.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.dev_mset.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.dev_publish.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.dev_publish.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.dev_publish.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.dev_publish.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.dev_subscribe.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.dev_subscribe.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.dev_subscribe.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.dev_subscribe.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.generate_key.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.generate_key.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.generate_key.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.generate_key.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.get_meta_info.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.get_meta_info.rst similarity index 93% rename from docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.get_meta_info.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.get_meta_info.rst index 8bf2d8c210342a65d392179f2adc1531185e6816..41deb418fc9846ad2cc206fdaa7c6da2cdf5927b 100644 --- a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.get_meta_info.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.get_meta_info.rst @@ -1,5 +1,5 @@ datasystem.hetero_client.HeteroClient.get_meta_info -============================================== +=================================================== .. py:method:: datasystem.hetero_client.HeteroClient.get_meta_info(self, keys, is_dev_key) diff --git a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.init.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.init.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.init.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.init.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.mget_h2d.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.mget_h2d.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.mget_h2d.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.mget_h2d.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.mset_d2h.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.mset_d2h.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/hetero_client/HeteroClient/datasystem.hetero_client.HeteroClient.mset_d2h.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.mset_d2h.rst diff --git a/docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.HeteroClient.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.rst similarity index 45% rename from docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.HeteroClient.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.rst index 4fdf685ba1820f5293ade1c0968ceab22da7f852..d4610c3c74fd3410f65e6718f927908d02ff1d32 100644 --- a/docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.HeteroClient.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.HeteroClient.rst @@ -20,9 +20,46 @@ datasystem.hetero_client.HeteroClient 输出: HeteroClient -.. dscnautosummary:: - :toctree: HeteroClient - :nosignatures: + **方法**: + + .. list-table:: + :widths: 40 60 + :header-rows: 0 + + * - :doc:`init ` + - 初始化异构对象客户端。 + * - :doc:`mget_h2d ` + - 从 host 中获取数据并写入 device 中。 + * - :doc:`mset_d2h ` + - 将 device 的数据写入到 host 中。 + * - :doc:`async_mget_h2d ` + - 从 host 中获取数据并写入 device 中的异步接口。 + * - :doc:`async_mset_d2h ` + - 将 device 的数据写入到 host 中的异步接口。 + * - :doc:`delete ` + - 删除 host 中的 key,与 mget_h2d / mset_d2h 配套使用。 + * - :doc:`dev_publish ` + - 将 device 上的内存发布为数据系统的异构对象。发布后的异构对象可通过 dev_subscribe 获取。 + * - :doc:`dev_subscribe ` + - 订阅发布到数据系统的异构对象,并接收数据写入 data_blob_list。数据通过 device to device 通道直接传输。 + * - :doc:`dev_mset ` + - 通过数据系统缓存 Device 上的数据。 + * - :doc:`dev_mget ` + - 获取 device 中的数据。 + * - :doc:`dev_local_delete ` + - 从数据系统删除本节点上此 key 的元数据,不再管理此 key 对应的 device 内存。 + * - :doc:`dev_delete ` + - 从数据系统删除此 key 的元数据,不再管理此 key 对应的 device 内存。 + * - :doc:`async_dev_delete ` + - 从数据系统删除此 key 的元数据的异步接口,删除成功后不再管理此 key 对应的 device 内存。 + * - :doc:`generate_key ` + - 生成一个带数据系统 Worker UUID 的 key。 + * - :doc:`get_meta_info ` + - 获取keys 对应的元数据信息。 + +.. toctree:: + :maxdepth: 1 + :hidden: datasystem.hetero_client.HeteroClient.init datasystem.hetero_client.HeteroClient.mget_h2d @@ -36,5 +73,6 @@ datasystem.hetero_client.HeteroClient datasystem.hetero_client.HeteroClient.dev_mget datasystem.hetero_client.HeteroClient.dev_local_delete datasystem.hetero_client.HeteroClient.dev_delete + datasystem.hetero_client.HeteroClient.async_dev_delete datasystem.hetero_client.HeteroClient.generate_key datasystem.hetero_client.HeteroClient.get_meta_info diff --git a/docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.MetaInfo.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.MetaInfo.rst similarity index 73% rename from docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.MetaInfo.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.MetaInfo.rst index 38e4d4d67f7e1714736d258c6eea5fbeaec889f5..b02c89fa12f78c2cb6eb633ba0799341884ccd9d 100644 --- a/docs/source_zh_cn/api/api_python/hetero_client/datasystem.hetero_client.MetaInfo.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.hetero_client.MetaInfo.rst @@ -1,5 +1,5 @@ datasystem.hetero_client.MetaInfo -============================= +================================= .. py:class:: datasystem.hetero_client.MetaInfo(blob_size_list) @@ -10,7 +10,3 @@ datasystem.hetero_client.MetaInfo 输出: MetaInfo - -.. dscnautosummary:: - :toctree: MetaInfo - :nosignatures: \ No newline at end of file diff --git a/docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.delete.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.delete.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.delete.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.delete.rst diff --git a/docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.exist.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.exist.rst similarity index 92% rename from docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.exist.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.exist.rst index 2c89a214ceea6573d807fd369c4c8f39f39c5ecd..5b0f6e74b3199796ed857a49cdd5d9ec8c03a860 100644 --- a/docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.exist.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.exist.rst @@ -1,5 +1,5 @@ datasystem.kv_client.KVClient.exist -================================= +=================================== .. py:method:: datasystem.kv_client.KVClient.exist(self, keys) diff --git a/docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.expire.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.expire.rst similarity index 94% rename from docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.expire.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.expire.rst index c779bbb59e455546c05f9328ece10e88a9622fe5..9a6626fecf39c8f8beb8694d063dd452c4e04ca7 100644 --- a/docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.expire.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.expire.rst @@ -1,5 +1,5 @@ datasystem.kv_client.KVClient.expire -================================= +==================================== .. py:method:: datasystem.kv_client.KVClient.expire(self, keys, ttl_second) diff --git a/docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.generate_key.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.generate_key.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.generate_key.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.generate_key.rst diff --git a/docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.get.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.get.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.get.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.get.rst diff --git a/docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.get_read_only_buffers.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.get_read_only_buffers.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.get_read_only_buffers.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.get_read_only_buffers.rst diff --git a/docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.init.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.init.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.init.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.init.rst diff --git a/docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.mset.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.mset.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.mset.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.mset.rst diff --git a/docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.msettx.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.msettx.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.msettx.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.msettx.rst diff --git a/docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.read.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.read.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.read.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.read.rst diff --git a/docs/source_zh_cn/api/api_python/kv_client/datasystem.kv_client.KVClient.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.rst similarity index 52% rename from docs/source_zh_cn/api/api_python/kv_client/datasystem.kv_client.KVClient.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.rst index 36d833b64833eb44b756958329d8ebf2cfdcba17..39b0277c67aba4e1b9891ee1c44f14265b0676f1 100644 --- a/docs/source_zh_cn/api/api_python/kv_client/datasystem.kv_client.KVClient.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.rst @@ -20,18 +20,50 @@ datasystem.kv_client.KVClient 输出: KVClient -.. dscnautosummary:: - :toctree: KVClient - :nosignatures: + **方法**: + + .. list-table:: + :widths: 40 60 + :header-rows: 0 + + * - :doc:`init ` + - 初始化KV缓存客户端以连接到 Worker 。 + * - :doc:`set ` + - 设置键的值。 + * - :doc:`set_value ` + - 设置键的值,键由系统生成并返回。 + * - :doc:`mset ` + - 批量设置键值对。 + * - :doc:`msettx ` + - 批量设置键值对(事务操作),它保证所有的键要么都成功设置,要么都失败。 + * - :doc:`get_read_only_buffers ` + - 获取所有给定键的值。 + * - :doc:`get ` + - 获取所有给定键的值。 + * - :doc:`read ` + - 读取指定偏移量的数据。 + * - :doc:`delete ` + - 初始化KV缓存客户端以连接到 Worker 。 + * - :doc:`generate_key ` + - 生成一个带数据系统 Worker UUID 的 key。 + * - :doc:`exist ` + - 查看 key 在数据系统中是否存在。 + * - :doc:`expire ` + - 为一组键设置过期生命周期,返回函数操作状态及设置失败的键列表。 + +.. toctree:: + :maxdepth: 1 + :hidden: - datasystem.kv_client.KVClient.delete - datasystem.kv_client.KVClient.generate_key - datasystem.kv_client.KVClient.get_read_only_buffers - datasystem.kv_client.KVClient.get datasystem.kv_client.KVClient.init + datasystem.kv_client.KVClient.set + datasystem.kv_client.KVClient.set_value datasystem.kv_client.KVClient.mset datasystem.kv_client.KVClient.msettx + datasystem.kv_client.KVClient.get_read_only_buffers + datasystem.kv_client.KVClient.get datasystem.kv_client.KVClient.read - datasystem.kv_client.KVClient.set - datasystem.kv_client.KVClient.set_value + datasystem.kv_client.KVClient.delete + datasystem.kv_client.KVClient.generate_key + datasystem.kv_client.KVClient.exist datasystem.kv_client.KVClient.expire diff --git a/docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.set.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.set.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.set.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.set.rst diff --git a/docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.set_value.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.set_value.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/KVClient/datasystem.kv_client.KVClient.set_value.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.KVClient.set_value.rst diff --git a/docs/source_zh_cn/api/api_python/kv_client/ReadOnlyBuffer/datasystem.kv_client.ReadOnlyBuffer.immutable_data.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.ReadOnlyBuffer.immutable_data.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/ReadOnlyBuffer/datasystem.kv_client.ReadOnlyBuffer.immutable_data.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.ReadOnlyBuffer.immutable_data.rst diff --git a/docs/source_zh_cn/api/api_python/kv_client/ReadOnlyBuffer/datasystem.kv_client.ReadOnlyBuffer.rlatch.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.ReadOnlyBuffer.rlatch.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/ReadOnlyBuffer/datasystem.kv_client.ReadOnlyBuffer.rlatch.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.ReadOnlyBuffer.rlatch.rst diff --git a/docs/source_zh_cn/api/api_python/kv_client/datasystem.kv_client.ReadOnlyBuffer.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.ReadOnlyBuffer.rst similarity index 40% rename from docs/source_zh_cn/api/api_python/kv_client/datasystem.kv_client.ReadOnlyBuffer.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.ReadOnlyBuffer.rst index 484e3e1c9c703e53240a9b341284505e66f67add..e3a27b4ab4dde9c373e9b4ee0fa5609a224d7a66 100644 --- a/docs/source_zh_cn/api/api_python/kv_client/datasystem.kv_client.ReadOnlyBuffer.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.ReadOnlyBuffer.rst @@ -8,9 +8,22 @@ datasystem.kv_client.ReadOnlyBuffer 输出: ReadOnlyBuffer。 -.. dscnautosummary:: - :toctree: ReadOnlyBuffer - :nosignatures: + **方法**: + + .. list-table:: + :widths: 40 60 + :header-rows: 0 + + * - :doc:`immutable_data ` + - 获取一个不可变的数据内存视图。 + * - :doc:`rlatch ` + - 获取读锁以保护缓冲区免受并发写操作。 + * - :doc:`unrlatch ` + - 释放读锁。 + +.. toctree:: + :maxdepth: 1 + :hidden: datasystem.kv_client.ReadOnlyBuffer.immutable_data datasystem.kv_client.ReadOnlyBuffer.rlatch diff --git a/docs/source_zh_cn/api/api_python/kv_client/ReadOnlyBuffer/datasystem.kv_client.ReadOnlyBuffer.unrlatch.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.ReadOnlyBuffer.unrlatch.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/ReadOnlyBuffer/datasystem.kv_client.ReadOnlyBuffer.unrlatch.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.ReadOnlyBuffer.unrlatch.rst diff --git a/docs/source_zh_cn/api/api_python/kv_client/datasystem.kv_client.ReadParam.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.ReadParam.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/datasystem.kv_client.ReadParam.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.ReadParam.rst diff --git a/docs/source_zh_cn/api/api_python/kv_client/datasystem.kv_client.SetParam.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.SetParam.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/kv_client/datasystem.kv_client.SetParam.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.kv_client.SetParam.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.get_size.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.get_size.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.get_size.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.get_size.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.immutable_data.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.immutable_data.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.immutable_data.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.immutable_data.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.invalidate_buffer.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.invalidate_buffer.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.invalidate_buffer.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.invalidate_buffer.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.memory_copy.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.memory_copy.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.memory_copy.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.memory_copy.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.mutable_data.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.mutable_data.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.mutable_data.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.mutable_data.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.publish.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.publish.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.publish.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.publish.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.rlatch.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.rlatch.rst similarity index 91% rename from docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.rlatch.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.rlatch.rst index 8340457175e94a797b65f9e1f50ce541e9ba9b63..08e53a0b62300690c395bb87f2fb957588d47967 100644 --- a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.rlatch.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.rlatch.rst @@ -3,7 +3,7 @@ datasystem.object_client.Buffer.rlatch .. py:method:: datasystem.object_client.Buffer.rlatch(timeout_sec=60) - 对对象Buffer加读锁。 + 对共享内存Buffer加读锁。 参数: - **timeout_sec** (int) - 尝试加锁的最大等待时间(单位为秒)。默认值: ``60`` 。 diff --git a/docs/source_zh_cn/api/api_python/object_client/datasystem.object_client.Buffer.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.rst similarity index 30% rename from docs/source_zh_cn/api/api_python/object_client/datasystem.object_client.Buffer.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.rst index 5694d8ae2a3785fb32bfcec836577ad29ccf2a6c..89076146ff73992882421a1b0edac43542a83268 100644 --- a/docs/source_zh_cn/api/api_python/object_client/datasystem.object_client.Buffer.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.rst @@ -8,9 +8,38 @@ datasystem.object_client.Buffer 输出: Buffer。 -.. dscnautosummary:: - :toctree: Buffer - :nosignatures: + **方法**: + + .. list-table:: + :widths: 40 60 + :header-rows: 0 + + * - :doc:`wlatch ` + - 对共享内存Buffer加写锁。 + * - :doc:`unwlatch ` + - 对共享内存Buffer解写锁。 + * - :doc:`rlatch ` + - 对共享内存Buffer加读锁。 + * - :doc:`unrlatch ` + - 对共享内存Buffer解读锁。 + * - :doc:`mutable_data ` + - 获取Buffer的可读写 `memoryview`。 + * - :doc:`immutable_data ` + - 获取Buffer的只读 `memoryview`。 + * - :doc:`memory_copy ` + - 将 `value` 中的数据拷贝到Buffer中 + * - :doc:`publish ` + - 将Buffer中的数据发布到数据系统中。 + * - :doc:`seal ` + - 将Buffer中的数据发布到数据系统中,发布成功之后Buffer所对应的对象的值将无法再被修改。 + * - :doc:`invalidate_buffer ` + - 使当前主机上的Buffer数据无效化。 + * - :doc:`get_size ` + - 获取对象buffer的大小。 + +.. toctree:: + :maxdepth: 1 + :hidden: datasystem.object_client.Buffer.wlatch datasystem.object_client.Buffer.unwlatch diff --git a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.seal.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.seal.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.seal.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.seal.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.unrlatch.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.unrlatch.rst similarity index 84% rename from docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.unrlatch.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.unrlatch.rst index 88beb29308f518fdb93752b38b772982ef3c7409..a1fc8020aaf35e6687a7015d057a593f8f1e5728 100644 --- a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.unrlatch.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.unrlatch.rst @@ -3,7 +3,7 @@ datasystem.object_client.Buffer.unrlatch .. py:method:: datasystem.object_client.Buffer.unrlatch - 对对象Buffer解读锁。 + 对共享内存Buffer解读锁。 异常: - **RuntimeError** - 解读锁失败。 \ No newline at end of file diff --git a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.unwlatch.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.unwlatch.rst similarity index 84% rename from docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.unwlatch.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.unwlatch.rst index 3b2d022fb760657e7ef1ca58225f2d19a8711b0a..0d44fec7989f9247d76084ae8c0cc16316dd4627 100644 --- a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.unwlatch.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.unwlatch.rst @@ -3,7 +3,7 @@ datasystem.object_client.Buffer.unwlatch .. py:method:: datasystem.object_client.Buffer.unwlatch - 对对象Buffer解写锁。 + 对共享内存Buffer解写锁。 异常: - **RuntimeError** - 解写锁失败。 \ No newline at end of file diff --git a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.wlatch.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.wlatch.rst similarity index 91% rename from docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.wlatch.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.wlatch.rst index 9266d21b7866123462f5e041cd7b4b5968167674..ccc1a2cffbd047b04cb8fc9bb5483a2639993302 100644 --- a/docs/source_zh_cn/api/api_python/object_client/Buffer/datasystem.object_client.Buffer.wlatch.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.Buffer.wlatch.rst @@ -3,7 +3,7 @@ datasystem.object_client.Buffer.wlatch .. py:method:: datasystem.object_client.Buffer.wlatch(timeout_sec=60) - 对对象Buffer加写锁。 + 对共享内存Buffer加写锁。 参数: - **timeout_sec** (int) - 尝试加锁的最大等待时间(单位为秒)。默认值: ``60`` 。 diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.CacheType.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.CacheType.rst new file mode 100644 index 0000000000000000000000000000000000000000..5100a1ea5e095bec5db633c96628dc5fda9bc5e5 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.CacheType.rst @@ -0,0 +1,15 @@ +datasystem.object_client.CacheType +======================================== + +.. py:class:: datasystem.object_client.CacheType + + `CacheType` 类定义对象的缓存介质。 + + 目前,支持以下 `CacheType`: + + =================================== ================================================================== + 定义 说明 + =================================== ================================================================== + `CacheType::MEMORY` 内存介质,数据将缓存在共享内存上。 + `CacheType::DISK` 磁盘介质,数据将缓存在磁盘上。 + =================================== ================================================================== \ No newline at end of file diff --git a/docs/source_zh_cn/api/api_python/object_client/datasystem.object_client.ConsistencyType.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ConsistencyType.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/datasystem.object_client.ConsistencyType.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ConsistencyType.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.create.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.create.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.create.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.create.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.g_decrease_ref.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.g_decrease_ref.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.g_decrease_ref.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.g_decrease_ref.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.g_increase_ref.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.g_increase_ref.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.g_increase_ref.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.g_increase_ref.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.generate_object_key.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.generate_object_key.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.generate_object_key.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.generate_object_key.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.get.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.get.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.get.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.get.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.init.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.init.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.init.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.init.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.put.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.put.rst similarity index 96% rename from docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.put.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.put.rst index 3b3a34f14a0d4c97e46d20a45fdb30d32414c031..0462febb0f139a355a41e35044418766caa5d37a 100644 --- a/docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.put.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.put.rst @@ -3,7 +3,7 @@ datasystem.object_client.ObjectClient.put .. py:method:: datasystem.object_client.ObjectClient.put(object_key, value, write_mode=WriteMode.NONE_L2_CACHE, consistency_type=ConsistencyType.PRAM, nested_object_keys=None) - 将对象写入到数据系统中。 + 将对象缓存到数据系统中。 参数: - **object_key** (str) - 对象 key。 diff --git a/docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.query_global_ref_num.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.query_global_ref_num.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/ObjectClient/datasystem.object_client.ObjectClient.query_global_ref_num.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.query_global_ref_num.rst diff --git a/docs/source_zh_cn/api/api_python/object_client/datasystem.object_client.ObjectClient.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.rst similarity index 57% rename from docs/source_zh_cn/api/api_python/object_client/datasystem.object_client.ObjectClient.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.rst index e1446ffa9eb52cbbbc748f39e99b07b79a613cf7..4f1767a1f4e688a19c994f16509587f4b601b9a0 100644 --- a/docs/source_zh_cn/api/api_python/object_client/datasystem.object_client.ObjectClient.rst +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.ObjectClient.rst @@ -19,9 +19,30 @@ datasystem.object_client.ObjectClient 输出: ObjectClient -.. dscnautosummary:: - :toctree: ObjectClient - :nosignatures: + .. list-table:: + :widths: 40 60 + :header-rows: 0 + + * - :doc:`init ` + - 初始化对象缓存客户端。 + * - :doc:`create ` + - 创建对象buffer。 + * - :doc:`put ` + - 将对象缓存到数据系统中。 + * - :doc:`get ` + - 获取给定列表对象 key 的Buffer。 + * - :doc:`g_increase_ref ` + - 增加给定列表对象 key 的全局引用计数。 + * - :doc:`g_decrease_ref ` + - 减少给定列表对象 key 的全局引用计数。 + * - :doc:`query_global_ref_num ` + - 查询对象全局引用计数。 + * - :doc:`generate_object_key ` + - 生成一个带数据系统Worker UUID的对象 key。 + +.. toctree:: + :maxdepth: 1 + :hidden: datasystem.object_client.ObjectClient.init datasystem.object_client.ObjectClient.create diff --git a/docs/source_zh_cn/api/api_python/object_client/datasystem.object_client.WriteMode.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.WriteMode.rst similarity index 100% rename from docs/source_zh_cn/api/api_python/object_client/datasystem.object_client.WriteMode.rst rename to docs/zh-cn/latest/html/_sources/development-guide/api/python/datasystem.object_client.WriteMode.rst diff --git a/docs/zh-cn/latest/html/_sources/development-guide/api/python/index.rst b/docs/zh-cn/latest/html/_sources/development-guide/api/python/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..d132d867e27007dd86b9651429434a95da69bbb5 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/api/python/index.rst @@ -0,0 +1,181 @@ +Python +============================== + + +.. toctree:: + :glob: + :hidden: + :maxdepth: 1 + + datasystem.DsClient + datasystem.DsTensorClient + datasystem.hetero_client.HeteroClient + datasystem.hetero_client.Blob + datasystem.hetero_client.DeviceBlobList + datasystem.hetero_client.Future + datasystem.hetero_client.MetaInfo + datasystem.kv_client.KVClient + datasystem.kv_client.ReadOnlyBuffer + datasystem.kv_client.SetParam + datasystem.kv_client.ReadParam + datasystem.object_client.ObjectClient + datasystem.object_client.Buffer + datasystem.object_client.ConsistencyType + datasystem.object_client.WriteMode + datasystem.object_client.CacheType + +DsClient:聚合各语义的客户端 +----------------------------------- + +.. list-table:: + :widths: 30 70 + :header-rows: 0 + + * - :doc:`datasystem.DsClient.init ` + - 初始化数据系统客户端 + * - :doc:`datasystem.DsClient.hetero ` + - 获取数据系统异构缓存客户端。 + * - :doc:`datasystem.DsClient.kv ` + - 获取数据系统KV缓存客户端。 + * - :doc:`datasystem.DsClient.object ` + - 获取数据系统对象缓存客户端。 + + +Tensor接口 +----------------- + +.. list-table:: + :header-rows: 0 + :widths: 30 70 + + * - :doc:`datasystem.DsTensorClient.init ` + - 初始化数据系统客户端。 + * - :doc:`datasystem.DsTensorClient.mset_d2h ` + - 将 device 的数据写入到 host 中。 + * - :doc:`datasystem.DsTensorClient.mget_h2d ` + - 从 host 中获取数据并写入 device 中。 + * - :doc:`datasystem.DsTensorClient.async_mset_d2h ` + - 将 device 的数据写入到 host 中的异步接口。 + * - :doc:`datasystem.DsTensorClient.async_mget_h2d ` + - 从 host 中获取数据并写入 device 中的异步接口。 + * - :doc:`datasystem.DsTensorClient.delete ` + - 删除 host 中的 key。 + * - :doc:`datasystem.DsTensorClient.dev_send ` + - 订阅发布到数据系统的异构对象,并接收数据写入 tensors。 + * - :doc:`datasystem.DsTensorClient.dev_recv ` + - 将 device 上的内存发布为数据系统的异构对象,发布后的异构对象可通过 dev_recv 获取。 + * - :doc:`datasystem.DsTensorClient.dev_mset ` + - 通过数据系统缓存 Device 上的数据。 + * - :doc:`datasystem.DsTensorClient.dev_mget ` + - 获取 device 中的数据,并写入到 Tensor 中。 + * - :doc:`datasystem.DsTensorClient.dev_local_delete ` + - 从数据系统删除本节点上此 key 的元数据,不再管理此 key 对应的 device 内存。 + * - :doc:`datasystem.DsTensorClient.dev_delete ` + - 从数据系统删除此 key 的元数据,不再管理此 key 对应的 device 内存。 + * - :doc:`datasystem.DsTensorClient.async_dev_delete ` + - 从数据系统删除此 key 的元数据的异步接口,删除成功后不再管理此 key 对应的 device 内存。 + * - :doc:`datasystem.DsTensorClient.put_page_attn_layerwise_d2d ` + - 将 PagedAttention 的层级 Tensor 发布为数据系统的异构对象。发布后的异构对象可通过 get_page_attn_layerwise_d2d 获取。 + * - :doc:`datasystem.DsTensorClient.get_page_attn_layerwise_d2d ` + - 根据 key 获取缓存在数据系统的 PagedAttention 的层级 Tensor。 + * - :doc:`datasystem.DsTensorClient.mset_page_attn_blockwise_d2h ` + - 将 PagedAttention 的层级 Tensor 异步写入 Host 中。 + * - :doc:`datasystem.DsTensorClient.mget_page_attn_blockwise_h2d ` + - 从 Host 中获取 PagedAttention 的层级 Tensor 并写入 Device 中。 + + +异构对象接口 +----------------- + +.. list-table:: + :header-rows: 0 + :widths: 30 70 + + * - :doc:`datasystem.hetero_client.HeteroClient.init ` + - 初始化异构对象客户端。 + * - :doc:`datasystem.hetero_client.HeteroClient.mget_h2d ` + - 从 host 中获取数据并写入 device 中。 + * - :doc:`datasystem.hetero_client.HeteroClient.mset_d2h ` + - 将 device 的数据写入到 host 中。 + * - :doc:`datasystem.hetero_client.HeteroClient.async_mget_h2d ` + - 从 host 中获取数据并写入 device 中的异步接口。 + * - :doc:`datasystem.hetero_client.HeteroClient.async_mset_d2h ` + - 将 device 的数据写入到 host 中的异步接口。 + * - :doc:`datasystem.hetero_client.HeteroClient.delete ` + - 删除 host 中的 key,与 mget_h2d / mset_d2h 配套使用。 + * - :doc:`datasystem.hetero_client.HeteroClient.dev_publish ` + - 将 device 上的内存发布为数据系统的异构对象。发布后的异构对象可通过 dev_subscribe 获取。 + * - :doc:`datasystem.hetero_client.HeteroClient.dev_subscribe ` + - 订阅发布到数据系统的异构对象,并接收数据写入 data_blob_list。数据通过 device to device 通道直接传输。 + * - :doc:`datasystem.hetero_client.HeteroClient.dev_mset ` + - 通过数据系统缓存 Device 上的数据。 + * - :doc:`datasystem.hetero_client.HeteroClient.dev_mget ` + - 获取 device 中的数据。 + * - :doc:`datasystem.hetero_client.HeteroClient.dev_local_delete ` + - 从数据系统删除本节点上此 key 的元数据,不再管理此 key 对应的 device 内存。 + * - :doc:`datasystem.hetero_client.HeteroClient.dev_delete ` + - 从数据系统删除此 key 的元数据,不再管理此 key 对应的 device 内存。 + * - :doc:`datasystem.hetero_client.HeteroClient.async_dev_delete ` + - 从数据系统删除此 key 的元数据的异步接口,删除成功后不再管理此 key 对应的 device 内存。 + * - :doc:`datasystem.hetero_client.HeteroClient.generate_key ` + - 生成一个带数据系统 Worker UUID 的 key。 + * - :doc:`datasystem.hetero_client.HeteroClient.get_meta_info ` + - 获取keys 对应的元数据信息。 + + +KV接口 +----------------- + +.. list-table:: + :header-rows: 0 + :widths: 30 70 + + * - :doc:`datasystem.kv_client.KVClient.init ` + - 初始化KV缓存客户端以连接到 Worker 。 + * - :doc:`datasystem.kv_client.KVClient.set ` + - 设置键的值。 + * - :doc:`datasystem.kv_client.KVClient.set_value ` + - 设置键的值,键由系统生成并返回。 + * - :doc:`datasystem.kv_client.KVClient.mset ` + - 批量设置键值对。 + * - :doc:`datasystem.kv_client.KVClient.msettx ` + - 批量设置键值对(事务操作),它保证所有的键要么都成功设置,要么都失败。 + * - :doc:`datasystem.kv_client.KVClient.get_read_only_buffers ` + - 获取所有给定键的值。 + * - :doc:`datasystem.kv_client.KVClient.get ` + - 获取所有给定键的值。 + * - :doc:`datasystem.kv_client.KVClient.read ` + - 读取指定偏移量的数据。 + * - :doc:`datasystem.kv_client.KVClient.delete ` + - 初始化KV缓存客户端以连接到 Worker 。 + * - :doc:`datasystem.kv_client.KVClient.generate_key ` + - 生成一个带数据系统 Worker UUID 的 key。 + * - :doc:`datasystem.kv_client.KVClient.exist ` + - 查看 key 在数据系统中是否存在。 + * - :doc:`datasystem.kv_client.KVClient.expire ` + - 为一组键设置过期生命周期,返回函数操作状态及设置失败的键列表。 + + +对象缓存接口 +----------------- + +.. list-table:: + :header-rows: 0 + :widths: 30 70 + + * - :doc:`datasystem.object_client.ObjectClient.init ` + - 初始化对象缓存客户端。 + * - :doc:`datasystem.object_client.ObjectClient.create ` + - 创建对象buffer。 + * - :doc:`datasystem.object_client.ObjectClient.put ` + - 将对象缓存到数据系统中。 + * - :doc:`datasystem.object_client.ObjectClient.get ` + - 获取给定列表对象 key 的Buffer。 + * - :doc:`datasystem.object_client.ObjectClient.g_increase_ref ` + - 增加给定列表对象 key 的全局引用计数。 + * - :doc:`datasystem.object_client.ObjectClient.g_decrease_ref ` + - 减少给定列表对象 key 的全局引用计数。 + * - :doc:`datasystem.object_client.ObjectClient.query_global_ref_num ` + - 查询对象全局引用计数。 + * - :doc:`datasystem.object_client.ObjectClient.generate_object_key ` + - 生成一个带数据系统Worker UUID的对象 key。 \ No newline at end of file diff --git a/docs/source_zh_cn/development-guide/hetero.md b/docs/zh-cn/latest/html/_sources/development-guide/example/hetero.md similarity index 99% rename from docs/source_zh_cn/development-guide/hetero.md rename to docs/zh-cn/latest/html/_sources/development-guide/example/hetero.md index 01398cb5b13a3c5133e7b00aa111aaddcede0b9c..7c58cf25baaffe5a1473fcf6f54ff00faceb8812 100644 --- a/docs/source_zh_cn/development-guide/hetero.md +++ b/docs/zh-cn/latest/html/_sources/development-guide/example/hetero.md @@ -423,7 +423,7 @@ def hetero_mset_d2h_mget_h2d(): ```cpp -#include "datasystem/hetero_cache/hetero_client.h" +#include "datasystem/hetero_client.h" #include ConnectOptions connectOptions = { .host = "127.0.0.1", .port = 31501 }; diff --git a/docs/zh-cn/latest/html/_sources/development-guide/example/index.md b/docs/zh-cn/latest/html/_sources/development-guide/example/index.md new file mode 100644 index 0000000000000000000000000000000000000000..b831d1a8d87cacd5cff56772a3d95a5890185f71 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/example/index.md @@ -0,0 +1,16 @@ +# 编程指南 + +```{eval-rst} +.. toctree:: + :hidden: + + hetero.md + kv.md + object.md +``` + +[异构对象开发指南](hetero.md) + +[KV开发指南](kv.md) + +[对象缓存开发指南](object.md) diff --git a/docs/source_zh_cn/development-guide/kv.md b/docs/zh-cn/latest/html/_sources/development-guide/example/kv.md similarity index 100% rename from docs/source_zh_cn/development-guide/kv.md rename to docs/zh-cn/latest/html/_sources/development-guide/example/kv.md diff --git a/docs/source_zh_cn/development-guide/object.md b/docs/zh-cn/latest/html/_sources/development-guide/example/object.md similarity index 100% rename from docs/source_zh_cn/development-guide/object.md rename to docs/zh-cn/latest/html/_sources/development-guide/example/object.md diff --git a/docs/zh-cn/latest/html/_sources/development-guide/index.md b/docs/zh-cn/latest/html/_sources/development-guide/index.md new file mode 100644 index 0000000000000000000000000000000000000000..f0d416a47838c4d973c215ca7e834e6f624a2c03 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/development-guide/index.md @@ -0,0 +1,20 @@ +# 编程接口 + +```{eval-rst} +.. toctree:: + :hidden: + + example/index.md + api/index.md +``` + +本节向您介绍如何使用 openYuanrong datasystem 开发指南以及 openYuanrong datasystem 相关 API。 + +openYuanrong datasystem 开发指南: +- [异构对象开发指南](example/hetero.md) +- [KV开发指南](example/kv.md) +- [对象缓存开发指南](example/object.md) + +openYuanrong datasystem API: +- [Python](api/python/index.rst) +- [C++](api/cpp/index.rst) diff --git a/docs/zh-cn/latest/html/_sources/getting-started/getting_started.md b/docs/zh-cn/latest/html/_sources/getting-started/getting_started.md new file mode 100644 index 0000000000000000000000000000000000000000..e88cac5ea44090d6d297a44ae9fd679ec9d83604 --- /dev/null +++ b/docs/zh-cn/latest/html/_sources/getting-started/getting_started.md @@ -0,0 +1,358 @@ +(overview-getting-started)= + +# 入门 + +## 安装 openYuanrong datasystem + +### pip 方式安装 + +- 安装 openYuanrong datasystem 完整发行版(包含Python SDK、C++ SDK以及命令行工具): + ```bash + pip install https://openyuanrong.obs.cn-southwest-2.myhuaweicloud.com/openyuanrong_datasystem-0.5.0-cp39-cp39-manylinux_2_34_x86_64.whl + ``` + +- 仅安装 openYuanrong datasystem Python SDK(不包含C++ SDK以及命令行工具): + ```bash + pip install https://openyuanrong.obs.cn-southwest-2.myhuaweicloud.com/openyuanrong_datasystem_sdk-0.5.0-cp39-cp39-manylinux_2_34_x86_64.whl + ``` + +### 源码编译方式安装 + +使用源码编译方式安装 openYuanrong datasystem 可以参考文档:[源码编译安装 openYuanrong datasystem](../installation/installation_linux.md#源码编译安装) + +## 部署 openYuanrong datasystem + +### 进程部署 + +- 准备ETCD + + openYuanrong datasystem 的集群管理依赖 ETCD,请先在后台启动单节点 ETCD(示例端口 2379): + ```bash + etcd --listen-client-urls http://0.0.0.0:2379 \ + --advertise-client-urls http://localhost:2379 & + ``` +- 一键部署 + + 安装 openYuanrong datasystem 完整发行版后,即可通过随包自带的 dscli 命令行工具一键完成集群部署。在当前启动一个监听端口号为 31501 的服务端进程: + ```bash + dscli start -w --worker_address "127.0.0.1:31501" --etcd_address "127.0.0.1:2379" + ``` + +- 一键卸载 + ```bash + dscli stop --worker_address "127.0.0.1:31501" + ``` + +更多进程部署参数与部署方式请参考文档:[openYuanrong datasystem 进程部署](../deployment/deploy.md#openyuanrong-datasystem进程部署) + +### Kubernetes 部署 + +openYuanrong datasystem 还提供了基于 Kubernetes 容器化部署方式,部署前请确保部署环境集群已就绪 Kubernetes、Helm 及可访问的 ETCD 集群。 + +- 获取 openYuanrong datasystem helm chart 包 + + 安装 openYuanrong datasystem 完整发行版后,即可通过随包自带的 dscli 命令行工具在当前路径下快速获取 helm chart 包: + ``` + dscli generate_helm_chart -o ./ + ``` + +- 编辑集群部署配置 + + openYuanrong datasystem 通过 ./datasystem/values.yaml 文件进行集群相关配置,其中必配项如下: + + ```yaml + global: + # 其他配置项... + + # 镜像仓地址 + imageRegistry: "swr.cn-south-1.myhuaweicloud.com/openeuler/" + # 镜像名字和镜像tag + images: + datasystem: "openYuanrong-datasystem:0.5.0" + + etcd: + # ETCD集群地址 + etcdAddress: "127.0.0.1:2379" + ``` + +- 集群部署 + + Helm 会提交 DaemonSet,按节点依次拉起 openYuanrong datasystem 实例: + + ```bash + helm install openyuanrong_datasystem ./datasystem + ``` + +- 集群卸载 + + ```bash + helm uninstall openyuanrong_datasystem + ``` + +更多 openYuanrong datasystem Kubernetes 高级参数配置请参考文档:[openYuanrong datasystem Kubernetes 部署](../deployment/deploy.md#openyuanrong-datasystem-kubernetes部署) + +## 开发指南 + +### 异构对象 + +异构对象实现对 HBM 内存的抽象管理,能够高效实现 D2D/H2D/D2H 的数据传输,加速 AI 训推场景数据读写。 + +主要应用场景 + +- **LLM 长序列推理 KVCache**:基于异构对象提供分布式多级缓存 (HBM/DRAM/SSD) 和高吞吐 D2D/H2D/D2H 访问能力,构建分布式 KV Cache,实现 Prefill 阶段的 KVCache 缓存以及 Prefill/Decode 实例间 KV Cache 快速传递,提升推理吞吐。 +- **模型推理实例 M->N 快速弹性**:利用异构对象的卡间直通及 P2P 数据分发能力实现模型参数快速复制。 +- **训练场景 CheckPoint 快速加载到 HBM**:各节点将待恢复的 Checkpoint 分片加载到异构对象中,利用异构对象的卡间直通传输及 P2P 数据分发能力,快速将 Checkpoint 传递到各节点 HBM。 + +通过异构对象接口,将任意二进制数据以键值对形式写入 HBM: + +```python +import acl +import os +from datasystem import Blob, DsClient, DeviceBlobList + +# hetero_dev_mset and hetero_dev_mget must be executed in different processes +# because they need to be bound to different NPUs. +def hetero_dev_mset(): + client = DsClient("127.0.0.1", 31501) + client.init() + + acl.init() + device_idx = 1 + acl.rt.set_device(device_idx) + + key_list = [ 'key1', 'key2', 'key3' ] + data_size = 1024 * 1024 + test_value = "value" + + in_data_blob_list = [] + for _ in key_list: + tmp_batch_list = [] + for _ in range(4): + dev_ptr, _ = acl.rt.malloc(data_size, 0) + acl.rt.memcpy(dev_ptr, data_size, acl.util.bytes_to_ptr(test_value.encode()), data_size, 1) + blob = Blob(dev_ptr, data_size) + tmp_batch_list.append(blob) + blob_list = DeviceBlobList(device_idx, tmp_batch_list) + in_data_blob_list.append(blob_list) + client.hetero().dev_mset(key_list, in_data_blob_list) + +def hetero_dev_mget(): + client = DsClient("127.0.0.1", 31501) + client.init() + + acl.init() + device_idx = 2 + acl.rt.set_device(device_idx) + + key_list = [ 'key1', 'key2', 'key3' ] + data_size = 1024 * 1024 + out_data_blob_list = [] + for _ in key_list: + tmp_batch_list = [] + for _ in range(4): + dev_ptr, _ = acl.rt.malloc(data_size, 0) + blob = Blob(dev_ptr, data_size) + tmp_batch_list.append(blob) + blob_list = DeviceBlobList(device_idx, tmp_batch_list) + out_data_blob_list.append(blob_list) + client.hetero().dev_mget(key_list, out_data_blob_list, 60000) + client.hetero().dev_delete(key_list) + +pid = os.fork() +if pid == 0: + hetero_dev_mset() + os._exit(0) +else: + hetero_dev_mget() + os.wait() +``` + +更多异构对象使用方式请参考:[异构对象开发指南](../development-guide/example/hetero.md) + +### KV + +基于共享内存实现免拷贝的 KV 数据读写,支持通过对接外部组件提供数据可靠性语义,支持数据在 DRAM / SSD / 二级缓存之间置换,实现大容量高性能缓存。 + +主要应用场景 + +- **训练场景 Checkpoint 快速保存及加载**:基于 KV 接口快速读写 Checkpoint,并支持将数据持久化到二级缓存保证数据可靠性。 + +通过 KV 接口,将任意二进制数据以键值对形式写入 DDR: + +::::{tab-set} + +:::{tab-item} Python + +```python +from datasystem.ds_client import DsClient + +client = DsClient("127.0.0.1", 31501) +client.init() + +key = "key" +expected_val = b"value" +client.kv().set(key, expected_val) + +val = client.kv().get([key]) +assert val[0] == expected_val + +client.kv().delete([key]) +``` + +::: + +:::{tab-item} C++ + +```cpp +#include "datasystem/datasystem.h" + +using namespace datasystem; + +#define ASSERT_TRUE(condition) \ + do { \ + if (!(condition)) { \ + fprintf(stderr, "Assertion failed: %s, file %s, line %d\n", \ + #condition, __FILE__, __LINE__); \ + exit(1); \ + } \ + } while(0) + +int main() +{ + ConnectOptions connectOptions = { .host = "127.0.0.1", .port = 31501 }; + auto client = std::make_shared(connectOptions); + ASSERT_TRUE(client->Init().IsOk()); + + std::string key = "testKey"; + std::string value = "Hello kv client"; + std::string value2 = "Hello modify"; + Status status = client->KV()->Set(key, value); + ASSERT_TRUE(status.IsOk()); + + std::string getValue; + status = client->KV()->Get(key, getValue); + ASSERT_TRUE(status.IsOk()); + ASSERT_TRUE(getValue == value); + + status = client->KV()->Set(key, value2); + ASSERT_TRUE(status.IsOk()); + + status = client->KV()->Get(key, getValue); + ASSERT_TRUE(status.IsOk()); + ASSERT_TRUE(getValue == value2); + + status = client->KV()->Del(key); + ASSERT_TRUE(status.IsOk()); + + status = client->KV()->Get(key, getValue); + ASSERT_TRUE(status.IsError()); + return 0; +} +``` + +::: + +:::: + +更多KV使用方式请参考:[KV开发指南](../development-guide/example/kv.md) + +### Object + +基于共享内存实现 Object 语义读写,提供基于引用计数管理生命周期,将共享内存抽象为 buffer,直接映射共享内存指针,提供更底层灵活的编程接口。 + +::::{tab-set} + +:::{tab-item} Python + +```python +import random +from datasystem.ds_client import DsClient + +def random_str(slen=10): + seed = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#%^*()_+=-" + sa = [] + for _ in range(slen): + sa.append(random.choice(seed)) + return ''.join(sa) + +def object_test(): + client = DsClient("127.0.0.1", 31501) + client.init() + object_key = "test_key" + value = bytes(random_str(100), encoding='utf8') + buffer = client.object().create(object_key, len(value)) + client.object().g_increase_ref([object_key]) + assert client.object().query_global_ref_num(object_key) == 1 + buffer.wlatch() + buffer.memory_copy(value) + buffer.seal() + buffer.unwlatch() + buffer_list = client.object().get([object_key], 0) + assert buffer_list[0].immutable_data().tobytes() == value + #self.assertEqual(buffer_list[0].immutable_data().tobytes(), value) + client.object().g_decrease_ref([object_key]) + assert client.object().query_global_ref_num(object_key) == 0 + #self.assertEqual(client.object().query_global_ref_num(object_key), 0) + try: + client.object().get([object_key], 0) + except RuntimeError as e: + print("get error:", e) + +object_test() +``` + +::: + +:::{tab-item} C++ + +```cpp +#include "datasystem/datasystem.h" + +using namespace datasystem; + +#define ASSERT_TRUE(condition) \ + do { \ + if (!(condition)) { \ + fprintf(stderr, "Assertion failed: %s, file %s, line %d\n", \ + #condition, __FILE__, __LINE__); \ + exit(1); \ + } \ + } while(0) + +int main() +{ + ConnectOptions connectOptions = { .host = "127.0.0.1", .port = 31501 }; + auto client = std::make_shared(connectOptions); + ASSERT_TRUE(client->Init().IsOk()); + + std::string objectKey = "testKey"; + std::string data = "Hello object client"; + int size = data.size(); + std::shared_ptr buffer; + Status status = client->Object()->Create(objectKey, size, CreateParam{}, buffer); + ASSERT_TRUE(status.IsOk()); + ASSERT_EQ(size, buffer->GetSize()); + std::vector failedobjectKeys; + ASSERT_TRUE(client->Object()->GIncreaseRef({ objectKey }, failedobjectKeys).IsOk()); + buffer->WLatch(); + buffer->MemoryCopy((void *)data.data(), size); + buffer->Seal(); + buffer->UnWLatch(); + + std::vector> buffers; + ASSERT_TRUE(client->Object()->Get({ objectKey }, 0, buffers).IsOk()); + ASSERT_EQ(buffers[0]->GetSize(), size); + buffers[0]->RLatch(); + ASSERT_EQ(memcmp(data.data(), buffers[0]->MutableData(), size), 0); + buffers[0]->UnRLatch(); + ASSERT_TRUE(client->Object()->GDecreaseRef({ objectKey }, failedobjectKeys).IsOk()); + ASSERT_TRUE(client->Object()->Get({ objectKey }, 0, buffers).IsError()); + return 0; +} +``` + +::: + +:::: + +更多对象缓存使用方式请参考:[Object开发指南](../development-guide/example/object.md) \ No newline at end of file diff --git a/README_CN.md b/docs/zh-cn/latest/html/_sources/index.rst similarity index 36% rename from README_CN.md rename to docs/zh-cn/latest/html/_sources/index.rst index 76482bb60570b57b0b391de5df6f6e3eb2d02ac9..9cb16aa2e3c04afecbb94b36a9f77b53af6526f5 100644 --- a/README_CN.md +++ b/docs/zh-cn/latest/html/_sources/index.rst @@ -1,18 +1,5 @@ -![](./docs/source_zh_cn/getting-started/image/logo-large.png) - -openYuanrong 是一个 Serverless 分布式计算引擎,致力于以一套统一 Serverless 架构支持 AI、大数据、微服务等各类分布式应用。它提供多语言函数编程接口,以单机编程体验简化分布式应用开发;提供分布式动态调度和数据共享等能力,实现分布式应用的高性能运行和集群的高效资源利用。 - -## 简介 - -![](./docs/source_zh_cn/getting-started/image/introduction.png) - -openYuanrong 由多语言函数运行时、函数系统和数据系统组成,支持按需灵活单独或组合使用。 - -- **多语言函数运行时**:提供函数分布式编程,支持 Python、Java、C++ 语言,实现类单机编程高性能分布式运行。 -- **函数系统**:提供大规模分布式动态调度,支持函数实例极速弹性扩缩和跨节点迁移,实现集群资源高效利用。 -- **数据系统**:提供异构分布式多级缓存,支持 Object、Stream 语义,实现函数实例间高性能数据共享及传递。 - -openYuanrong 分为三个代码仓库:[yuanrong-runtime](https://gitee.com/openeuler/yuanrong-runtime) 对应多语言函数运行时;[yuanrong-functionsystem](https://gitee.com/openeuler/yuanrong-functionsystem) 对应函数系统;[yuanrong-datasystem](https://gitee.com/openeuler/yuanrong-datasystem) 对应数据系统,即当前代码仓。 +概述 +===== **数据系统(openYuanrong datasystem)** 是 openYuanrong 的核心概念抽象,是一个分布式缓存系统,利用计算集群的 HBM/DRAM/SSD 资源构建近计算多级缓存,提升模型训练及推理、大数据、微服务等场景数据访问性能。 @@ -27,7 +14,8 @@ openYuanrong datasystem 的主要特性包括: - **数据发布订阅**:支持数据订阅发布,解耦数据的生产者(发布者)和消费者(订阅者),实现数据的异步传输与共享。 - **高可靠高可用**:支持分布式元数据管理,实现系统水平线性扩展。支持元数据可靠性,支持动态资源伸缩自动迁移数据,实现系统高可用。 -### openYuanrong datasystem 适用场景 +openYuanrong datasystem 适用场景 +-------------------------------- - **LLM 长序列推理 KVCache**:基于异构对象提供分布式多级缓存 (HBM/DRAM/SSD) 和高吞吐 D2D/H2D/D2H 访问能力,构建分布式 KV Cache,实现 Prefill 阶段的 KVCache 缓存以及 Prefill/Decode 实例间 KV Cache 快速传递,提升推理吞吐。 - **模型推理实例 M->N 快速弹性**:利用异构对象的卡间直通及 P2P 数据分发能力实现模型参数快速复制。 @@ -35,13 +23,20 @@ openYuanrong datasystem 的主要特性包括: - **训练场景 CheckPoint 快速保存及加载**:基于 KV 接口快速写 Checkpoint,并支持将数据持久化到二级缓存保证数据可靠性。Checkpoint恢复时各节点将 Checkpoint 分片快速加载到异构对象中,利用异构对象的卡间直通传输及 P2P 数据分发能力,快速将 Checkpoint 传递到各节点 HBM。 - **微服务状态数据快速读写**:基于 KV 接口实现内存级读写微服务状态数据,并支持将数据持久化到二级缓存保证数据可靠性。 -### openYuanrong datasystem 架构 +openYuanrong datasystem 架构 +---------------------------- -![](./docs/source_zh_cn/getting-started/image/logical_architecture.png) +.. figure:: ./images/logical_architecture.png + :alt: 逻辑架构图 + :width: 60% + :align: center + + openYuanrong datasystem 逻辑架构 openYuanrong datasystem 由三个部分组成: - **多语言SDK**:提供 Python/C++ 语言接口,封装 heterogeneous object 及 KV 接口,支撑业务实现数据快速读写。提供两种类型接口: + - **heterogeneous object**:基于 NPU 卡的 HBM 内存抽象异构对象接口,实现昇腾 NPU 卡间数据高速直通传输。同时提供 H2D/D2H 高速迁移接口,实现数据快速在 DRAM/HBM 之间传输。 - **KV**:基于共享内存实现免拷贝的 KV 接口,实现高性能数据缓存,支持通过对接外部组件提供数据可靠性语义。 @@ -49,7 +44,12 @@ openYuanrong datasystem 由三个部分组成: - **集群管理**:依赖 ETCD,实现节点发现/健康检测,支持故障恢复及在线扩缩容。 -![](./docs/source_zh_cn/getting-started/image/deployment.png) +.. figure:: ./images/deployment.png + :alt: 部署架构图 + :width: 60% + :align: center + + openYuanrong datasystem 部署架构 openYuanrong datasystem 的部署视图如上图所示: @@ -63,195 +63,13 @@ openYuanrong datasystem 的部署视图如上图所示: - worker 和 worker 之间通过 TCP/RDMA 传输数据(当前版本仅支持 TCP,RDMA/UB 即将支持)。 - 异构对象 HBM 之间通过 HCCS/RoCE 卡间直通传输数据。 -## 入门 - -### 安装 openYuanrong datasystem - -#### pip 方式安装 - -- 安装 openYuanrong datasystem 完整发行版(包含Python SDK、C++ SDK以及命令行工具): - ```bash - pip install https://openyuanrong.obs.cn-southwest-2.myhuaweicloud.com/openyuanrong_datasystem-0.5.0-cp39-cp39-manylinux_2_34_x86_64.whl - ``` - -- 仅安装 openYuanrong datasystem Python SDK(不包含C++ SDK以及命令行工具): - ```bash - pip install https://openyuanrong.obs.cn-southwest-2.myhuaweicloud.com/openyuanrong_datasystem_sdk-0.5.0-cp39-cp39-manylinux_2_34_x86_64.whl - ``` - -#### 源码编译方式安装 - -使用源码编译方式安装 openYuanrong datasystem 可以参考文档:[源码编译安装 openYuanrong datasystem](./docs/source_zh_cn/getting-started/install.md#源码编译安装) - -### 部署 openYuanrong datasystem - -#### 进程部署 - -- 准备ETCD - - openYuanrong datasystem 的集群管理依赖 ETCD,请先在后台启动单节点 ETCD(示例端口 2379): - ```bash - etcd --listen-client-urls http://0.0.0.0:2379 \ - --advertise-client-urls http://localhost:2379 & - ``` -- 一键部署 - - 安装 openYuanrong datasystem 完整发行版后,即可通过随包自带的 dscli 命令行工具一键完成集群部署。在当前启动一个监听端口号为 31501 的服务端进程: - ```bash - dscli start -w --worker_address "127.0.0.1:31501" --etcd_address "127.0.0.1:2379" - ``` - -- 一键卸载 - ```bash - dscli stop --worker_address "127.0.0.1:31501" - ``` - -更多进程部署参数与部署方式请参考文档:[openYuanrong datasystem 进程部署](./docs/source_zh_cn/getting-started/deploy.md#openyuanrong-datasystem进程部署) - -#### Kubernetes 部署 - -openYuanrong datasystem 还提供了基于 Kubernetes 容器化部署方式,部署前请确保部署环境集群已就绪 Kubernetes、Helm 及可访问的 ETCD 集群。 - -- 获取 openYuanrong datasystem helm chart 包 - - 安装 openYuanrong datasystem 完整发行版后,即可通过随包自带的 dscli 命令行工具在当前路径下快速获取 helm chart 包: - ``` - dscli generate_helm_chart -o ./ - ``` - -- 编辑集群部署配置 - - openYuanrong datasystem 通过 ./datasystem/values.yaml 文件进行集群相关配置,其中必配项如下: - - ```yaml - global: - # 其他配置项... - - # 镜像仓地址 - imageRegistry: "swr.cn-south-1.myhuaweicloud.com/openeuler/" - # 镜像名字和镜像tag - images: - datasystem: "openYuanrong-datasystem:0.5.0" - - etcd: - # ETCD集群地址 - etcdAddress: "127.0.0.1:2379" - ``` - -- 集群部署 - - Helm 会提交 DaemonSet,按节点依次拉起 openYuanrong datasystem 实例: - - ```bash - helm install openyuanrong_datasystem ./datasystem - ``` - -- 集群卸载 - - ```bash - helm uninstall openyuanrong_datasystem - ``` - -更多 openYuanrong datasystem Kubernetes 高级参数配置请参考文档:[openYuanrong datasystem Kubernetes 部署](./docs/source_zh_cn/getting-started/deploy.md#openyuanrong-datasystem-kubernetes部署) - -### 代码样例 - -- 异构对象 - - 通过异构对象接口,将任意二进制数据以键值对形式写入 HBM: - - ```python - import acl - import os - from datasystem import Blob, DsClient, DeviceBlobList - - # hetero_dev_mset and hetero_dev_mget must be executed in different processes - # because they need to be bound to different NPUs. - def hetero_dev_mset(): - client = DsClient("127.0.0.1", 31501) - client.init() - - acl.init() - device_idx = 1 - acl.rt.set_device(device_idx) - - key_list = [ 'key1', 'key2', 'key3' ] - data_size = 1024 * 1024 - test_value = "value" - - in_data_blob_list = [] - for _ in key_list: - tmp_batch_list = [] - for _ in range(4): - dev_ptr, _ = acl.rt.malloc(data_size, 0) - acl.rt.memcpy(dev_ptr, data_size, acl.util.bytes_to_ptr(test_value.encode()), data_size, 1) - blob = Blob(dev_ptr, data_size) - tmp_batch_list.append(blob) - blob_list = DeviceBlobList(device_idx, tmp_batch_list) - in_data_blob_list.append(blob_list) - client.hetero().dev_mset(key_list, in_data_blob_list) - - def hetero_dev_mget(): - client = DsClient("127.0.0.1", 31501) - client.init() - - acl.init() - device_idx = 2 - acl.rt.set_device(device_idx) - - key_list = [ 'key1', 'key2', 'key3' ] - data_size = 1024 * 1024 - out_data_blob_list = [] - for _ in key_list: - tmp_batch_list = [] - for _ in range(4): - dev_ptr, _ = acl.rt.malloc(data_size, 0) - blob = Blob(dev_ptr, data_size) - tmp_batch_list.append(blob) - blob_list = DeviceBlobList(device_idx, tmp_batch_list) - out_data_blob_list.append(blob_list) - client.hetero().dev_mget(key_list, out_data_blob_list, 60000) - client.hetero().dev_delete(key_list) - - pid = os.fork() - if pid == 0: - hetero_dev_mset() - os._exit(0) - else: - hetero_dev_mget() - os.wait() - ``` - -- KV - - 通过 KV 接口,将任意二进制数据以键值对形式写入 DDR: - - ```python - from datasystem.ds_client import DsClient - - client = DsClient("127.0.0.1", 31501) - client.init() - - key = "key" - expected_val = b"value" - client.kv().set(key, expected_val) - - val = client.kv().get([key]) - assert val[0] == expected_val - - client.kv().delete([key]) - ``` - -## 文档 - -有关 openYuanrong datasystem 安装指南、教程和 API 的更多详细信息,请参阅 [用户文档](docs)。 - -有关 openYuanrong 更多详细信息请参阅 [openYuanrong 文档](https://pages.openeuler.openatom.cn/openyuanrong/docs/zh-cn/latest/index.html),了解如何使用 openYuanrong 开发分布式应用。 - -## 贡献 - -我们欢迎您对 openYuanrong 做各种形式的贡献,请参阅我们的[贡献者指南](https://pages.openeuler.openatom.cn/openyuanrong/docs/zh-cn/latest/contributor_guide/index.html)。 - -## 许可证 +.. toctree:: + :hidden: -[Apache License 2.0](LICENSE) \ No newline at end of file + self + getting-started/getting_started + installation/installation_linux.md + deployment/index.md + development-guide/index.md + contributor_guide/contribution.md + appendix/index.md \ No newline at end of file diff --git a/docs/source_zh_cn/getting-started/install.md b/docs/zh-cn/latest/html/_sources/installation/installation_linux.md similarity index 98% rename from docs/source_zh_cn/getting-started/install.md rename to docs/zh-cn/latest/html/_sources/installation/installation_linux.md index 8b24c93ae40f4abad3fcf483326e77333b990227..02878a14ea877b70bdae00a0bb3a7340be20c499 100644 --- a/docs/source_zh_cn/getting-started/install.md +++ b/docs/zh-cn/latest/html/_sources/installation/installation_linux.md @@ -1,4 +1,6 @@ -# 安装openYuanrong datasystem +(overview-installation)= + +# 安装 @@ -115,7 +117,7 @@ source ${HOME}/Ascend/ascend-toolkit/set_env.sh ### 源码编译额外依赖 -> 如无需源码编译 openYuanrong datasystem,请跳过本章节,直接查看 [一键 pip 安装](#一键-pip-安装) +> 如无需源码编译 openYuanrong datasystem,请跳过本章节。 下表列出了源码编译openYuanrong datasystem所需额外第三方依赖: diff --git a/docs/zh-cn/latest/html/_sphinx_design_static/design-tabs.js b/docs/zh-cn/latest/html/_sphinx_design_static/design-tabs.js new file mode 100644 index 0000000000000000000000000000000000000000..b25bd6a4fa14a4831f7b77f8fe8e4e863b8523cf --- /dev/null +++ b/docs/zh-cn/latest/html/_sphinx_design_static/design-tabs.js @@ -0,0 +1,101 @@ +// @ts-check + +// Extra JS capability for selected tabs to be synced +// The selection is stored in local storage so that it persists across page loads. + +/** + * @type {Record} + */ +let sd_id_to_elements = {}; +const storageKeyPrefix = "sphinx-design-tab-id-"; + +/** + * Create a key for a tab element. + * @param {HTMLElement} el - The tab element. + * @returns {[string, string, string] | null} - The key. + * + */ +function create_key(el) { + let syncId = el.getAttribute("data-sync-id"); + let syncGroup = el.getAttribute("data-sync-group"); + if (!syncId || !syncGroup) return null; + return [syncGroup, syncId, syncGroup + "--" + syncId]; +} + +/** + * Initialize the tab selection. + * + */ +function ready() { + // Find all tabs with sync data + + /** @type {string[]} */ + let groups = []; + + document.querySelectorAll(".sd-tab-label").forEach((label) => { + if (label instanceof HTMLElement) { + let data = create_key(label); + if (data) { + let [group, id, key] = data; + + // add click event listener + // @ts-ignore + label.onclick = onSDLabelClick; + + // store map of key to elements + if (!sd_id_to_elements[key]) { + sd_id_to_elements[key] = []; + } + sd_id_to_elements[key].push(label); + + if (groups.indexOf(group) === -1) { + groups.push(group); + // Check if a specific tab has been selected via URL parameter + const tabParam = new URLSearchParams(window.location.search).get( + group + ); + if (tabParam) { + console.log( + "sphinx-design: Selecting tab id for group '" + + group + + "' from URL parameter: " + + tabParam + ); + window.sessionStorage.setItem(storageKeyPrefix + group, tabParam); + } + } + + // Check is a specific tab has been selected previously + let previousId = window.sessionStorage.getItem( + storageKeyPrefix + group + ); + if (previousId === id) { + // console.log( + // "sphinx-design: Selecting tab from session storage: " + id + // ); + // @ts-ignore + label.previousElementSibling.checked = true; + } + } + } + }); +} + +/** + * Activate other tabs with the same sync id. + * + * @this {HTMLElement} - The element that was clicked. + */ +function onSDLabelClick() { + let data = create_key(this); + if (!data) return; + let [group, id, key] = data; + for (const label of sd_id_to_elements[key]) { + if (label === this) continue; + // @ts-ignore + label.previousElementSibling.checked = true; + } + window.sessionStorage.setItem(storageKeyPrefix + group, id); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/docs/zh-cn/latest/html/_sphinx_design_static/sphinx-design.min.css b/docs/zh-cn/latest/html/_sphinx_design_static/sphinx-design.min.css new file mode 100644 index 0000000000000000000000000000000000000000..860c36da0fa2031b7f2a78677961d9e557a88f4f --- /dev/null +++ b/docs/zh-cn/latest/html/_sphinx_design_static/sphinx-design.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative;font-size:var(--sd-fontsize-dropdown)}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary.sd-summary-title{padding:.5em .6em .5em 1em;font-size:var(--sd-fontsize-dropdown-title);font-weight:var(--sd-fontweight-dropdown-title);user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;list-style:none;display:inline-flex;justify-content:space-between}details.sd-dropdown summary.sd-summary-title::-webkit-details-marker{display:none}details.sd-dropdown summary.sd-summary-title:focus{outline:none}details.sd-dropdown summary.sd-summary-title .sd-summary-icon{margin-right:.6em;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary.sd-summary-title .sd-summary-text{flex-grow:1;line-height:1.5;padding-right:.5rem}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker{pointer-events:none;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker svg{opacity:.6}details.sd-dropdown summary.sd-summary-title:hover .sd-summary-state-marker svg{opacity:1;transform:scale(1.1)}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown .sd-summary-chevron-right{transition:.25s}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-right{transform:rotate(90deg)}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-down{transform:rotate(180deg)}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-bg: rgba(0, 113, 188, 0.2);--sd-color-secondary-bg: rgba(108, 117, 125, 0.2);--sd-color-success-bg: rgba(40, 167, 69, 0.2);--sd-color-info-bg: rgba(23, 162, 184, 0.2);--sd-color-warning-bg: rgba(240, 179, 126, 0.2);--sd-color-danger-bg: rgba(220, 53, 69, 0.2);--sd-color-light-bg: rgba(248, 249, 250, 0.2);--sd-color-muted-bg: rgba(108, 117, 125, 0.2);--sd-color-dark-bg: rgba(33, 37, 41, 0.2);--sd-color-black-bg: rgba(0, 0, 0, 0.2);--sd-color-white-bg: rgba(255, 255, 255, 0.2);--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem;--sd-fontsize-dropdown: inherit;--sd-fontsize-dropdown-title: 1rem;--sd-fontweight-dropdown-title: 700} diff --git a/docs/zh-cn/latest/html/_static/basic.css b/docs/zh-cn/latest/html/_static/basic.css new file mode 100644 index 0000000000000000000000000000000000000000..9ca7106be198b8c84d179cf2d6a49340cf166b32 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/basic.css @@ -0,0 +1,906 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 270px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/zh-cn/latest/html/_static/check-solid.svg b/docs/zh-cn/latest/html/_static/check-solid.svg new file mode 100644 index 0000000000000000000000000000000000000000..92fad4b5c0b766702548d26ab2be2832e19ad4da --- /dev/null +++ b/docs/zh-cn/latest/html/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs/zh-cn/latest/html/_static/clipboard.min.js b/docs/zh-cn/latest/html/_static/clipboard.min.js new file mode 100644 index 0000000000000000000000000000000000000000..54b3c4638111e1d6433fa1a88b87180667db9cf0 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/docs/zh-cn/latest/html/_static/copybutton.css b/docs/zh-cn/latest/html/_static/copybutton.css new file mode 100644 index 0000000000000000000000000000000000000000..f1916ec7d1bb993b7909cd57cef0446d922982ff --- /dev/null +++ b/docs/zh-cn/latest/html/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

    Short

    + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/docs/zh-cn/latest/html/_static/copybutton.js b/docs/zh-cn/latest/html/_static/copybutton.js new file mode 100644 index 0000000000000000000000000000000000000000..39cbaa76b712ae5070ba5e2446748043ec36c183 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos, .gp, .go'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/docs/zh-cn/latest/html/_static/copybutton_funcs.js b/docs/zh-cn/latest/html/_static/copybutton_funcs.js new file mode 100644 index 0000000000000000000000000000000000000000..dbe1aaad79cd1f835c8fbb304d255e19a3b39512 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/docs/zh-cn/latest/html/_static/custom.css b/docs/zh-cn/latest/html/_static/custom.css new file mode 100644 index 0000000000000000000000000000000000000000..8c6d43cba4b53452001ac8b5e245a5ad9711de6a --- /dev/null +++ b/docs/zh-cn/latest/html/_static/custom.css @@ -0,0 +1,16 @@ +html { + --pst-font-family-base: 'Microsoft Yahei', 'Inter', sans-serif; +} + +.bd-page-width { + max-width: 100%; + min-width: 100%; +} + +.bd-content .sd-tab-set>input:checked+label { + border-color: #d3d3d3 #d3d3d3 transparent; +} + +.bd-content .sd-tab-set .sd-tab-content { + border-color: #d3d3d3; +} diff --git a/docs/zh-cn/latest/html/_static/design-tabs.js b/docs/zh-cn/latest/html/_static/design-tabs.js new file mode 100644 index 0000000000000000000000000000000000000000..b25bd6a4fa14a4831f7b77f8fe8e4e863b8523cf --- /dev/null +++ b/docs/zh-cn/latest/html/_static/design-tabs.js @@ -0,0 +1,101 @@ +// @ts-check + +// Extra JS capability for selected tabs to be synced +// The selection is stored in local storage so that it persists across page loads. + +/** + * @type {Record} + */ +let sd_id_to_elements = {}; +const storageKeyPrefix = "sphinx-design-tab-id-"; + +/** + * Create a key for a tab element. + * @param {HTMLElement} el - The tab element. + * @returns {[string, string, string] | null} - The key. + * + */ +function create_key(el) { + let syncId = el.getAttribute("data-sync-id"); + let syncGroup = el.getAttribute("data-sync-group"); + if (!syncId || !syncGroup) return null; + return [syncGroup, syncId, syncGroup + "--" + syncId]; +} + +/** + * Initialize the tab selection. + * + */ +function ready() { + // Find all tabs with sync data + + /** @type {string[]} */ + let groups = []; + + document.querySelectorAll(".sd-tab-label").forEach((label) => { + if (label instanceof HTMLElement) { + let data = create_key(label); + if (data) { + let [group, id, key] = data; + + // add click event listener + // @ts-ignore + label.onclick = onSDLabelClick; + + // store map of key to elements + if (!sd_id_to_elements[key]) { + sd_id_to_elements[key] = []; + } + sd_id_to_elements[key].push(label); + + if (groups.indexOf(group) === -1) { + groups.push(group); + // Check if a specific tab has been selected via URL parameter + const tabParam = new URLSearchParams(window.location.search).get( + group + ); + if (tabParam) { + console.log( + "sphinx-design: Selecting tab id for group '" + + group + + "' from URL parameter: " + + tabParam + ); + window.sessionStorage.setItem(storageKeyPrefix + group, tabParam); + } + } + + // Check is a specific tab has been selected previously + let previousId = window.sessionStorage.getItem( + storageKeyPrefix + group + ); + if (previousId === id) { + // console.log( + // "sphinx-design: Selecting tab from session storage: " + id + // ); + // @ts-ignore + label.previousElementSibling.checked = true; + } + } + } + }); +} + +/** + * Activate other tabs with the same sync id. + * + * @this {HTMLElement} - The element that was clicked. + */ +function onSDLabelClick() { + let data = create_key(this); + if (!data) return; + let [group, id, key] = data; + for (const label of sd_id_to_elements[key]) { + if (label === this) continue; + // @ts-ignore + label.previousElementSibling.checked = true; + } + window.sessionStorage.setItem(storageKeyPrefix + group, id); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/docs/zh-cn/latest/html/_static/doctools.js b/docs/zh-cn/latest/html/_static/doctools.js new file mode 100644 index 0000000000000000000000000000000000000000..0398ebb9f03db6e89df8022033b81923c82112fa --- /dev/null +++ b/docs/zh-cn/latest/html/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/zh-cn/latest/html/_static/documentation_options.js b/docs/zh-cn/latest/html/_static/documentation_options.js new file mode 100644 index 0000000000000000000000000000000000000000..dab586c0d273a422a7d1adae234c31797b32a38b --- /dev/null +++ b/docs/zh-cn/latest/html/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/zh-cn/latest/html/_static/file.png b/docs/zh-cn/latest/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/file.png differ diff --git a/docs/zh-cn/latest/html/_static/images/logo_binder.svg b/docs/zh-cn/latest/html/_static/images/logo_binder.svg new file mode 100644 index 0000000000000000000000000000000000000000..45fecf75114bea0e1f22ce6f412d6729d894f893 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/images/logo_binder.svg @@ -0,0 +1,19 @@ + + + + +logo + + + + + + + + diff --git a/docs/zh-cn/latest/html/_static/images/logo_colab.png b/docs/zh-cn/latest/html/_static/images/logo_colab.png new file mode 100644 index 0000000000000000000000000000000000000000..b7560ec216b2d1b6f77855525fe966c741833428 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/images/logo_colab.png differ diff --git a/docs/zh-cn/latest/html/_static/images/logo_deepnote.svg b/docs/zh-cn/latest/html/_static/images/logo_deepnote.svg new file mode 100644 index 0000000000000000000000000000000000000000..fa77ebfc258ac10ebdaa17a3dde4dfc75b8e8b2b --- /dev/null +++ b/docs/zh-cn/latest/html/_static/images/logo_deepnote.svg @@ -0,0 +1 @@ + diff --git a/docs/zh-cn/latest/html/_static/images/logo_jupyterhub.svg b/docs/zh-cn/latest/html/_static/images/logo_jupyterhub.svg new file mode 100644 index 0000000000000000000000000000000000000000..60cfe9f222e5617f1a4bc0de005685f7d8ce35af --- /dev/null +++ b/docs/zh-cn/latest/html/_static/images/logo_jupyterhub.svg @@ -0,0 +1 @@ +logo_jupyterhubHub diff --git a/docs/zh-cn/latest/html/_static/language_data.js b/docs/zh-cn/latest/html/_static/language_data.js new file mode 100644 index 0000000000000000000000000000000000000000..c7fe6c6fafad656c3aa8bea99e39386ad603b964 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs/zh-cn/latest/html/_static/locales/ar/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/ar/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..15541a6a375f93efed3f410c2f892174ba91aaa0 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/ar/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/ar/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/ar/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..066f20f9036c4ddb5301d029214c8b279d4684e1 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/ar/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "بواسطة" + +msgid "By" +msgstr "بواسطة" + +msgid "Contents" +msgstr "محتويات" + +msgid "Copyright" +msgstr "حقوق النشر" + +msgid "Download notebook file" +msgstr "تنزيل ملف دفتر الملاحظات" + +msgid "Download source file" +msgstr "تنزيل ملف المصدر" + +msgid "Download this page" +msgstr "قم بتنزيل هذه الصفحة" + +msgid "Edit this page" +msgstr "قم بتحرير هذه الصفحة" + +msgid "Fullscreen mode" +msgstr "وضع ملء الشاشة" + +msgid "Last updated on" +msgstr "آخر تحديث في" + +msgid "Launch" +msgstr "إطلاق" + +msgid "Open an issue" +msgstr "افتح قضية" + +msgid "Print to PDF" +msgstr "طباعة إلى PDF" + +msgid "Source repository" +msgstr "مستودع المصدر" + +msgid "Sphinx Book Theme" +msgstr "موضوع كتاب أبو الهول" + +msgid "Theme by the" +msgstr "موضوع بواسطة" + +msgid "Toggle navigation" +msgstr "تبديل التنقل" + +msgid "next page" +msgstr "الصفحة التالية" + +msgid "open issue" +msgstr "قضية مفتوحة" + +msgid "previous page" +msgstr "الصفحة السابقة" + +msgid "repository" +msgstr "مخزن" + +msgid "suggest edit" +msgstr "أقترح تحرير" diff --git a/docs/zh-cn/latest/html/_static/locales/bg/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/bg/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..da95120037f8d7c52ad1f166a7682ea55ca47a01 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/bg/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/bg/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/bg/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..0f22f49ad72633d5051ba9abac96edde1cb9857e --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/bg/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "По" + +msgid "By" +msgstr "От" + +msgid "Contents" +msgstr "Съдържание" + +msgid "Copyright" +msgstr "Авторско право" + +msgid "Download notebook file" +msgstr "Изтеглете файла на бележника" + +msgid "Download source file" +msgstr "Изтеглете изходния файл" + +msgid "Download this page" +msgstr "Изтеглете тази страница" + +msgid "Edit this page" +msgstr "Редактирайте тази страница" + +msgid "Fullscreen mode" +msgstr "Режим на цял екран" + +msgid "Last updated on" +msgstr "Последна актуализация на" + +msgid "Launch" +msgstr "Стартиране" + +msgid "Open an issue" +msgstr "Отворете проблем" + +msgid "Print to PDF" +msgstr "Печат в PDF" + +msgid "Source repository" +msgstr "Хранилище на източника" + +msgid "Sphinx Book Theme" +msgstr "Тема на книгата Sphinx" + +msgid "Theme by the" +msgstr "Тема от" + +msgid "Toggle navigation" +msgstr "Превключване на навигацията" + +msgid "next page" +msgstr "Следваща страница" + +msgid "open issue" +msgstr "отворен брой" + +msgid "previous page" +msgstr "предишна страница" + +msgid "repository" +msgstr "хранилище" + +msgid "suggest edit" +msgstr "предложи редактиране" diff --git a/docs/zh-cn/latest/html/_static/locales/bn/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/bn/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..6b96639b726a2fa959a6419b6f8b7e0dfcce33ae Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/bn/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/bn/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/bn/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..7202a5f320340d7508167e584c8c1943a42f9cdf --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/bn/LC_MESSAGES/booktheme.po @@ -0,0 +1,63 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "দ্বারা" + +msgid "By" +msgstr "দ্বারা" + +msgid "Copyright" +msgstr "কপিরাইট" + +msgid "Download notebook file" +msgstr "নোটবুক ফাইল ডাউনলোড করুন" + +msgid "Download source file" +msgstr "উত্স ফাইল ডাউনলোড করুন" + +msgid "Download this page" +msgstr "এই পৃষ্ঠাটি ডাউনলোড করুন" + +msgid "Edit this page" +msgstr "এই পৃষ্ঠাটি সম্পাদনা করুন" + +msgid "Last updated on" +msgstr "সর্বশেষ আপডেট" + +msgid "Launch" +msgstr "শুরু করা" + +msgid "Open an issue" +msgstr "একটি সমস্যা খুলুন" + +msgid "Print to PDF" +msgstr "পিডিএফ প্রিন্ট করুন" + +msgid "Source repository" +msgstr "উত্স সংগ্রহস্থল" + +msgid "Sphinx Book Theme" +msgstr "স্পিনিক্স বুক থিম" + +msgid "Theme by the" +msgstr "থিম দ্বারা" + +msgid "Toggle navigation" +msgstr "নেভিগেশন টগল করুন" + +msgid "next page" +msgstr "পরবর্তী পৃষ্ঠা" + +msgid "open issue" +msgstr "খোলা সমস্যা" + +msgid "previous page" +msgstr "আগের পৃষ্ঠা" diff --git a/docs/zh-cn/latest/html/_static/locales/ca/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/ca/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..a4dd30e9bd762578b119c4401d082ea4fa430613 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/ca/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/ca/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/ca/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..a325041f14ac36c2a56cec30ed3f696cb28cfb1b --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/ca/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Per la" + +msgid "By" +msgstr "Per" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download notebook file" +msgstr "Descarregar fitxer de quadern" + +msgid "Download source file" +msgstr "Baixeu el fitxer font" + +msgid "Download this page" +msgstr "Descarregueu aquesta pàgina" + +msgid "Edit this page" +msgstr "Editeu aquesta pàgina" + +msgid "Last updated on" +msgstr "Darrera actualització el" + +msgid "Launch" +msgstr "Llançament" + +msgid "Open an issue" +msgstr "Obriu un número" + +msgid "Print to PDF" +msgstr "Imprimeix a PDF" + +msgid "Source repository" +msgstr "Dipòsit de fonts" + +msgid "Sphinx Book Theme" +msgstr "Tema del llibre Esfinx" + +msgid "Theme by the" +msgstr "Tema del" + +msgid "Toggle navigation" +msgstr "Commuta la navegació" + +msgid "next page" +msgstr "pàgina següent" + +msgid "open issue" +msgstr "número obert" + +msgid "previous page" +msgstr "Pàgina anterior" + +msgid "suggest edit" +msgstr "suggerir edició" diff --git a/docs/zh-cn/latest/html/_static/locales/cs/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/cs/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..c39e01a6ae9ae5242f04566ffa2cda96b328ca18 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/cs/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/cs/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/cs/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..97e52e8a5b2ac28a73b2df81ae84d21b1b69a92f --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/cs/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Podle" + +msgid "By" +msgstr "Podle" + +msgid "Contents" +msgstr "Obsah" + +msgid "Copyright" +msgstr "autorská práva" + +msgid "Download notebook file" +msgstr "Stáhnout soubor poznámkového bloku" + +msgid "Download source file" +msgstr "Stáhněte si zdrojový soubor" + +msgid "Download this page" +msgstr "Stáhněte si tuto stránku" + +msgid "Edit this page" +msgstr "Upravit tuto stránku" + +msgid "Fullscreen mode" +msgstr "Režim celé obrazovky" + +msgid "Last updated on" +msgstr "Naposledy aktualizováno" + +msgid "Launch" +msgstr "Zahájení" + +msgid "Open an issue" +msgstr "Otevřete problém" + +msgid "Print to PDF" +msgstr "Tisk do PDF" + +msgid "Source repository" +msgstr "Zdrojové úložiště" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "Theme by the" +msgstr "Téma od" + +msgid "Toggle navigation" +msgstr "Přepnout navigaci" + +msgid "next page" +msgstr "další strana" + +msgid "open issue" +msgstr "otevřené číslo" + +msgid "previous page" +msgstr "předchozí stránka" + +msgid "repository" +msgstr "úložiště" + +msgid "suggest edit" +msgstr "navrhnout úpravy" diff --git a/docs/zh-cn/latest/html/_static/locales/da/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/da/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..f43157d70c63ff21b4385dc36cb73f5b14eb6b01 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/da/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/da/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/da/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..084b4e571094fc13da07c9d9a833a98b53b14b3f --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/da/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Ved" + +msgid "By" +msgstr "Ved" + +msgid "Contents" +msgstr "Indhold" + +msgid "Copyright" +msgstr "ophavsret" + +msgid "Download notebook file" +msgstr "Download notesbog-fil" + +msgid "Download source file" +msgstr "Download kildefil" + +msgid "Download this page" +msgstr "Download denne side" + +msgid "Edit this page" +msgstr "Rediger denne side" + +msgid "Fullscreen mode" +msgstr "Fuldskærmstilstand" + +msgid "Last updated on" +msgstr "Sidst opdateret den" + +msgid "Launch" +msgstr "Start" + +msgid "Open an issue" +msgstr "Åbn et problem" + +msgid "Print to PDF" +msgstr "Udskriv til PDF" + +msgid "Source repository" +msgstr "Kildelager" + +msgid "Sphinx Book Theme" +msgstr "Sphinx bogtema" + +msgid "Theme by the" +msgstr "Tema af" + +msgid "Toggle navigation" +msgstr "Skift navigation" + +msgid "next page" +msgstr "Næste side" + +msgid "open issue" +msgstr "åbent nummer" + +msgid "previous page" +msgstr "forrige side" + +msgid "repository" +msgstr "lager" + +msgid "suggest edit" +msgstr "foreslå redigering" diff --git a/docs/zh-cn/latest/html/_static/locales/de/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/de/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..648b565c7829535bc5f26f86909f458d0cd0fe1b Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/de/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/de/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/de/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..1ed1dc16a9dcc42ec2bb2e38726e802eefb32565 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/de/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Bis zum" + +msgid "By" +msgstr "Durch" + +msgid "Contents" +msgstr "Inhalt" + +msgid "Copyright" +msgstr "Urheberrechte ©" + +msgid "Download notebook file" +msgstr "Notebook-Datei herunterladen" + +msgid "Download source file" +msgstr "Quelldatei herunterladen" + +msgid "Download this page" +msgstr "Laden Sie diese Seite herunter" + +msgid "Edit this page" +msgstr "Bearbeite diese Seite" + +msgid "Fullscreen mode" +msgstr "Vollbildmodus" + +msgid "Last updated on" +msgstr "Zuletzt aktualisiert am" + +msgid "Launch" +msgstr "Starten" + +msgid "Open an issue" +msgstr "Öffnen Sie ein Problem" + +msgid "Print to PDF" +msgstr "In PDF drucken" + +msgid "Source repository" +msgstr "Quell-Repository" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-Buch-Thema" + +msgid "Theme by the" +msgstr "Thema von der" + +msgid "Toggle navigation" +msgstr "Navigation umschalten" + +msgid "next page" +msgstr "Nächste Seite" + +msgid "open issue" +msgstr "offenes Thema" + +msgid "previous page" +msgstr "vorherige Seite" + +msgid "repository" +msgstr "Repository" + +msgid "suggest edit" +msgstr "vorschlagen zu bearbeiten" diff --git a/docs/zh-cn/latest/html/_static/locales/el/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/el/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..fca6e9355f314677f2890f5679fd79dd67a7a5a2 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/el/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/el/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/el/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..27d1274a2887f6fea70bc13435447966c711c396 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/el/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Από το" + +msgid "By" +msgstr "Με" + +msgid "Contents" +msgstr "Περιεχόμενα" + +msgid "Copyright" +msgstr "Πνευματική ιδιοκτησία" + +msgid "Download notebook file" +msgstr "Λήψη αρχείου σημειωματάριου" + +msgid "Download source file" +msgstr "Λήψη αρχείου προέλευσης" + +msgid "Download this page" +msgstr "Λήψη αυτής της σελίδας" + +msgid "Edit this page" +msgstr "Επεξεργαστείτε αυτήν τη σελίδα" + +msgid "Fullscreen mode" +msgstr "ΛΕΙΤΟΥΡΓΙΑ ΠΛΗΡΟΥΣ ΟΘΟΝΗΣ" + +msgid "Last updated on" +msgstr "Τελευταία ενημέρωση στις" + +msgid "Launch" +msgstr "Εκτόξευση" + +msgid "Open an issue" +msgstr "Ανοίξτε ένα ζήτημα" + +msgid "Print to PDF" +msgstr "Εκτύπωση σε PDF" + +msgid "Source repository" +msgstr "Αποθήκη πηγής" + +msgid "Sphinx Book Theme" +msgstr "Θέμα βιβλίου Sphinx" + +msgid "Theme by the" +msgstr "Θέμα από το" + +msgid "Toggle navigation" +msgstr "Εναλλαγή πλοήγησης" + +msgid "next page" +msgstr "επόμενη σελίδα" + +msgid "open issue" +msgstr "ανοιχτό ζήτημα" + +msgid "previous page" +msgstr "προηγούμενη σελίδα" + +msgid "repository" +msgstr "αποθήκη" + +msgid "suggest edit" +msgstr "προτείνω επεξεργασία" diff --git a/docs/zh-cn/latest/html/_static/locales/eo/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/eo/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..d1072bbec62959524a87953d3f41b7c272ecbe37 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/eo/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/eo/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/eo/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..1fda1bcd31b1e57cc5473524babb3456a3aa88e8 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/eo/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Per la" + +msgid "By" +msgstr "De" + +msgid "Contents" +msgstr "Enhavo" + +msgid "Copyright" +msgstr "Kopirajto" + +msgid "Download notebook file" +msgstr "Elŝutu kajeran dosieron" + +msgid "Download source file" +msgstr "Elŝutu fontodosieron" + +msgid "Download this page" +msgstr "Elŝutu ĉi tiun paĝon" + +msgid "Edit this page" +msgstr "Redaktu ĉi tiun paĝon" + +msgid "Fullscreen mode" +msgstr "Plenekrana reĝimo" + +msgid "Last updated on" +msgstr "Laste ĝisdatigita la" + +msgid "Launch" +msgstr "Lanĉo" + +msgid "Open an issue" +msgstr "Malfermu numeron" + +msgid "Print to PDF" +msgstr "Presi al PDF" + +msgid "Source repository" +msgstr "Fonto-deponejo" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa Libro-Temo" + +msgid "Theme by the" +msgstr "Temo de la" + +msgid "Toggle navigation" +msgstr "Ŝalti navigadon" + +msgid "next page" +msgstr "sekva paĝo" + +msgid "open issue" +msgstr "malferma numero" + +msgid "previous page" +msgstr "antaŭa paĝo" + +msgid "repository" +msgstr "deponejo" + +msgid "suggest edit" +msgstr "sugesti redaktadon" diff --git a/docs/zh-cn/latest/html/_static/locales/es/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/es/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..ba2ee4dc22148ed53f2aeba32c5965654d4a5a2f Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/es/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/es/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/es/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..c91b41b948331c17a4801ada445317db03275136 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/es/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Por el" + +msgid "By" +msgstr "Por" + +msgid "Contents" +msgstr "Contenido" + +msgid "Copyright" +msgstr "Derechos de autor" + +msgid "Download notebook file" +msgstr "Descargar archivo de cuaderno" + +msgid "Download source file" +msgstr "Descargar archivo fuente" + +msgid "Download this page" +msgstr "Descarga esta pagina" + +msgid "Edit this page" +msgstr "Edita esta página" + +msgid "Fullscreen mode" +msgstr "Modo de pantalla completa" + +msgid "Last updated on" +msgstr "Ultima actualización en" + +msgid "Launch" +msgstr "Lanzamiento" + +msgid "Open an issue" +msgstr "Abrir un problema" + +msgid "Print to PDF" +msgstr "Imprimir en PDF" + +msgid "Source repository" +msgstr "Repositorio de origen" + +msgid "Sphinx Book Theme" +msgstr "Tema del libro de la esfinge" + +msgid "Theme by the" +msgstr "Tema por el" + +msgid "Toggle navigation" +msgstr "Navegación de palanca" + +msgid "next page" +msgstr "siguiente página" + +msgid "open issue" +msgstr "Tema abierto" + +msgid "previous page" +msgstr "pagina anterior" + +msgid "repository" +msgstr "repositorio" + +msgid "suggest edit" +msgstr "sugerir editar" diff --git a/docs/zh-cn/latest/html/_static/locales/et/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/et/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..983b82391f499b67a9046c15d0dd8744650ad925 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/et/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/et/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/et/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..2fd1ea2087836a29c166e7bf3f60565c7f49e9e9 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/et/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Autor" + +msgid "By" +msgstr "Kõrval" + +msgid "Contents" +msgstr "Sisu" + +msgid "Copyright" +msgstr "Autoriõigus" + +msgid "Download notebook file" +msgstr "Laadige sülearvuti fail alla" + +msgid "Download source file" +msgstr "Laadige alla lähtefail" + +msgid "Download this page" +msgstr "Laadige see leht alla" + +msgid "Edit this page" +msgstr "Muutke seda lehte" + +msgid "Fullscreen mode" +msgstr "Täisekraanirežiim" + +msgid "Last updated on" +msgstr "Viimati uuendatud" + +msgid "Launch" +msgstr "Käivitage" + +msgid "Open an issue" +msgstr "Avage probleem" + +msgid "Print to PDF" +msgstr "Prindi PDF-i" + +msgid "Source repository" +msgstr "Allikahoidla" + +msgid "Sphinx Book Theme" +msgstr "Sfinksiraamatu teema" + +msgid "Theme by the" +msgstr "Teema" + +msgid "Toggle navigation" +msgstr "Lülita navigeerimine sisse" + +msgid "next page" +msgstr "järgmine leht" + +msgid "open issue" +msgstr "avatud küsimus" + +msgid "previous page" +msgstr "eelmine leht" + +msgid "repository" +msgstr "hoidla" + +msgid "suggest edit" +msgstr "soovita muuta" diff --git a/docs/zh-cn/latest/html/_static/locales/fi/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/fi/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..d8ac054597c924e3010f629caeac1c748b7211cd Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/fi/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/fi/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/fi/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..2843f2c79ff74973f2540dea85963d3eddf0af99 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/fi/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Mukaan" + +msgid "By" +msgstr "Tekijä" + +msgid "Contents" +msgstr "Sisällys" + +msgid "Copyright" +msgstr "Tekijänoikeus" + +msgid "Download notebook file" +msgstr "Lataa muistikirjatiedosto" + +msgid "Download source file" +msgstr "Lataa lähdetiedosto" + +msgid "Download this page" +msgstr "Lataa tämä sivu" + +msgid "Edit this page" +msgstr "Muokkaa tätä sivua" + +msgid "Fullscreen mode" +msgstr "Koko näytön tila" + +msgid "Last updated on" +msgstr "Viimeksi päivitetty" + +msgid "Launch" +msgstr "Tuoda markkinoille" + +msgid "Open an issue" +msgstr "Avaa ongelma" + +msgid "Print to PDF" +msgstr "Tulosta PDF-tiedostoon" + +msgid "Source repository" +msgstr "Lähteen arkisto" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-kirjan teema" + +msgid "Theme by the" +msgstr "Teeman tekijä" + +msgid "Toggle navigation" +msgstr "Vaihda navigointia" + +msgid "next page" +msgstr "seuraava sivu" + +msgid "open issue" +msgstr "avoin ongelma" + +msgid "previous page" +msgstr "Edellinen sivu" + +msgid "repository" +msgstr "arkisto" + +msgid "suggest edit" +msgstr "ehdottaa muokkausta" diff --git a/docs/zh-cn/latest/html/_static/locales/fr/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/fr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..f663d39f0faa76c5b9bd504c51252eef74cca5de Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/fr/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/fr/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/fr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..351cddd6bfad5b3df9f029ca075244d683cba424 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/fr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Par le" + +msgid "By" +msgstr "Par" + +msgid "Contents" +msgstr "Contenu" + +msgid "Copyright" +msgstr "droits d'auteur" + +msgid "Download notebook file" +msgstr "Télécharger le fichier notebook" + +msgid "Download source file" +msgstr "Télécharger le fichier source" + +msgid "Download this page" +msgstr "Téléchargez cette page" + +msgid "Edit this page" +msgstr "Modifier cette page" + +msgid "Fullscreen mode" +msgstr "Mode plein écran" + +msgid "Last updated on" +msgstr "Dernière mise à jour le" + +msgid "Launch" +msgstr "lancement" + +msgid "Open an issue" +msgstr "Ouvrez un problème" + +msgid "Print to PDF" +msgstr "Imprimer au format PDF" + +msgid "Source repository" +msgstr "Dépôt source" + +msgid "Sphinx Book Theme" +msgstr "Thème du livre Sphinx" + +msgid "Theme by the" +msgstr "Thème par le" + +msgid "Toggle navigation" +msgstr "Basculer la navigation" + +msgid "next page" +msgstr "page suivante" + +msgid "open issue" +msgstr "signaler un problème" + +msgid "previous page" +msgstr "page précédente" + +msgid "repository" +msgstr "dépôt" + +msgid "suggest edit" +msgstr "suggestion de modification" diff --git a/docs/zh-cn/latest/html/_static/locales/hr/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/hr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..eca4a1a2842830f06bd5f6235bf01d07bdd313d2 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/hr/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/hr/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/hr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..3c1cf0795420f2070ceef65c297d235cd7baf179 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/hr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Od strane" + +msgid "By" +msgstr "Po" + +msgid "Contents" +msgstr "Sadržaj" + +msgid "Copyright" +msgstr "Autorska prava" + +msgid "Download notebook file" +msgstr "Preuzmi datoteku bilježnice" + +msgid "Download source file" +msgstr "Preuzmi izvornu datoteku" + +msgid "Download this page" +msgstr "Preuzmite ovu stranicu" + +msgid "Edit this page" +msgstr "Uredite ovu stranicu" + +msgid "Fullscreen mode" +msgstr "Način preko cijelog zaslona" + +msgid "Last updated on" +msgstr "Posljednje ažuriranje:" + +msgid "Launch" +msgstr "Pokrenite" + +msgid "Open an issue" +msgstr "Otvorite izdanje" + +msgid "Print to PDF" +msgstr "Ispis u PDF" + +msgid "Source repository" +msgstr "Izvorno spremište" + +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" + +msgid "Theme by the" +msgstr "Tema autora" + +msgid "Toggle navigation" +msgstr "Uključi / isključi navigaciju" + +msgid "next page" +msgstr "sljedeća stranica" + +msgid "open issue" +msgstr "otvoreno izdanje" + +msgid "previous page" +msgstr "Prethodna stranica" + +msgid "repository" +msgstr "spremište" + +msgid "suggest edit" +msgstr "predloži uređivanje" diff --git a/docs/zh-cn/latest/html/_static/locales/id/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/id/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..d07a06a9d27aaf6d67234c227c22d61d5a23203b Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/id/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/id/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/id/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..809498c723c9ba25deb10e54989737a9ecde771a --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/id/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Oleh" + +msgid "By" +msgstr "Oleh" + +msgid "Contents" +msgstr "Isi" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Download notebook file" +msgstr "Unduh file notebook" + +msgid "Download source file" +msgstr "Unduh file sumber" + +msgid "Download this page" +msgstr "Unduh halaman ini" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "Fullscreen mode" +msgstr "Mode layar penuh" + +msgid "Last updated on" +msgstr "Terakhir diperbarui saat" + +msgid "Launch" +msgstr "Meluncurkan" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "Theme by the" +msgstr "Tema oleh" + +msgid "Toggle navigation" +msgstr "Alihkan navigasi" + +msgid "next page" +msgstr "halaman selanjutnya" + +msgid "open issue" +msgstr "masalah terbuka" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "repository" +msgstr "gudang" + +msgid "suggest edit" +msgstr "menyarankan edit" diff --git a/docs/zh-cn/latest/html/_static/locales/it/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/it/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..53ba476edd2df2a802917e9df402257ceca1a130 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/it/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/it/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/it/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..fbc8d03b9ed34ebcb4898a3c3a9683cc5196bf67 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/it/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Dal" + +msgid "By" +msgstr "Di" + +msgid "Contents" +msgstr "Contenuti" + +msgid "Copyright" +msgstr "Diritto d'autore" + +msgid "Download notebook file" +msgstr "Scarica il file del taccuino" + +msgid "Download source file" +msgstr "Scarica il file sorgente" + +msgid "Download this page" +msgstr "Scarica questa pagina" + +msgid "Edit this page" +msgstr "Modifica questa pagina" + +msgid "Fullscreen mode" +msgstr "Modalità schermo intero" + +msgid "Last updated on" +msgstr "Ultimo aggiornamento il" + +msgid "Launch" +msgstr "Lanciare" + +msgid "Open an issue" +msgstr "Apri un problema" + +msgid "Print to PDF" +msgstr "Stampa in PDF" + +msgid "Source repository" +msgstr "Repository di origine" + +msgid "Sphinx Book Theme" +msgstr "Tema del libro della Sfinge" + +msgid "Theme by the" +msgstr "Tema di" + +msgid "Toggle navigation" +msgstr "Attiva / disattiva la navigazione" + +msgid "next page" +msgstr "pagina successiva" + +msgid "open issue" +msgstr "questione aperta" + +msgid "previous page" +msgstr "pagina precedente" + +msgid "repository" +msgstr "repository" + +msgid "suggest edit" +msgstr "suggerisci modifica" diff --git a/docs/zh-cn/latest/html/_static/locales/iw/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/iw/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..a45c6575e469914582f8223ac54793afc2f26575 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/iw/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/iw/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/iw/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..a82f351297eca71ca2aa810797502dc36402ffcb --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/iw/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: iw\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "דרך" + +msgid "By" +msgstr "על ידי" + +msgid "Contents" +msgstr "תוכן" + +msgid "Copyright" +msgstr "זכויות יוצרים" + +msgid "Download notebook file" +msgstr "הורד קובץ מחברת" + +msgid "Download source file" +msgstr "הורד את קובץ המקור" + +msgid "Download this page" +msgstr "הורד דף זה" + +msgid "Edit this page" +msgstr "ערוך דף זה" + +msgid "Fullscreen mode" +msgstr "מצב מסך מלא" + +msgid "Last updated on" +msgstr "עודכן לאחרונה ב" + +msgid "Launch" +msgstr "לְהַשִׁיק" + +msgid "Open an issue" +msgstr "פתח גיליון" + +msgid "Print to PDF" +msgstr "הדפס לקובץ PDF" + +msgid "Source repository" +msgstr "מאגר המקורות" + +msgid "Sphinx Book Theme" +msgstr "נושא ספר ספינקס" + +msgid "Theme by the" +msgstr "נושא מאת" + +msgid "Toggle navigation" +msgstr "החלף ניווט" + +msgid "next page" +msgstr "עמוד הבא" + +msgid "open issue" +msgstr "בעיה פתוחה" + +msgid "previous page" +msgstr "עמוד קודם" + +msgid "repository" +msgstr "מאגר" + +msgid "suggest edit" +msgstr "מציע לערוך" diff --git a/docs/zh-cn/latest/html/_static/locales/ja/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/ja/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..1cefd29ce3cc08792667a82dc7ff47e9843107be Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/ja/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/ja/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/ja/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..3caab09e19601d1f035231a07849734f72a522f1 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/ja/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "によって" + +msgid "By" +msgstr "著者" + +msgid "Contents" +msgstr "目次" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download notebook file" +msgstr "ノートブックファイルをダウンロード" + +msgid "Download source file" +msgstr "ソースファイルをダウンロード" + +msgid "Download this page" +msgstr "このページをダウンロード" + +msgid "Edit this page" +msgstr "このページを編集" + +msgid "Fullscreen mode" +msgstr "全画面モード" + +msgid "Last updated on" +msgstr "最終更新日" + +msgid "Launch" +msgstr "起動" + +msgid "Open an issue" +msgstr "問題を報告" + +msgid "Print to PDF" +msgstr "PDFに印刷" + +msgid "Source repository" +msgstr "ソースリポジトリ" + +msgid "Sphinx Book Theme" +msgstr "スフィンクスの本のテーマ" + +msgid "Theme by the" +msgstr "のテーマ" + +msgid "Toggle navigation" +msgstr "ナビゲーションを切り替え" + +msgid "next page" +msgstr "次のページ" + +msgid "open issue" +msgstr "未解決の問題" + +msgid "previous page" +msgstr "前のページ" + +msgid "repository" +msgstr "リポジトリ" + +msgid "suggest edit" +msgstr "編集を提案する" diff --git a/docs/zh-cn/latest/html/_static/locales/ko/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/ko/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..06c7ec938b4975c721caff60b956e343eef11570 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/ko/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/ko/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/ko/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..2db12a1b7d6cd4e7947aab6f358fed34e86bbc78 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/ko/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "에 의해" + +msgid "By" +msgstr "으로" + +msgid "Contents" +msgstr "내용" + +msgid "Copyright" +msgstr "저작권" + +msgid "Download notebook file" +msgstr "노트북 파일 다운로드" + +msgid "Download source file" +msgstr "소스 파일 다운로드" + +msgid "Download this page" +msgstr "이 페이지 다운로드" + +msgid "Edit this page" +msgstr "이 페이지 편집" + +msgid "Fullscreen mode" +msgstr "전체 화면으로보기" + +msgid "Last updated on" +msgstr "마지막 업데이트" + +msgid "Launch" +msgstr "시작하다" + +msgid "Open an issue" +msgstr "이슈 열기" + +msgid "Print to PDF" +msgstr "PDF로 인쇄" + +msgid "Source repository" +msgstr "소스 저장소" + +msgid "Sphinx Book Theme" +msgstr "스핑크스 도서 테마" + +msgid "Theme by the" +msgstr "테마별" + +msgid "Toggle navigation" +msgstr "탐색 전환" + +msgid "next page" +msgstr "다음 페이지" + +msgid "open issue" +msgstr "열린 문제" + +msgid "previous page" +msgstr "이전 페이지" + +msgid "repository" +msgstr "저장소" + +msgid "suggest edit" +msgstr "편집 제안" diff --git a/docs/zh-cn/latest/html/_static/locales/lt/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/lt/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..4468ba04bc134a84fea5e3c973461cf02c9c2da3 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/lt/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/lt/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/lt/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..07b64680be015c93aab77ed5fb42a8e1b348b101 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/lt/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Prie" + +msgid "By" +msgstr "Iki" + +msgid "Contents" +msgstr "Turinys" + +msgid "Copyright" +msgstr "Autorių teisės" + +msgid "Download notebook file" +msgstr "Atsisiųsti nešiojamojo kompiuterio failą" + +msgid "Download source file" +msgstr "Atsisiųsti šaltinio failą" + +msgid "Download this page" +msgstr "Atsisiųskite šį puslapį" + +msgid "Edit this page" +msgstr "Redaguoti šį puslapį" + +msgid "Fullscreen mode" +msgstr "Pilno ekrano režimas" + +msgid "Last updated on" +msgstr "Paskutinį kartą atnaujinta" + +msgid "Launch" +msgstr "Paleiskite" + +msgid "Open an issue" +msgstr "Atidarykite problemą" + +msgid "Print to PDF" +msgstr "Spausdinti į PDF" + +msgid "Source repository" +msgstr "Šaltinio saugykla" + +msgid "Sphinx Book Theme" +msgstr "Sfinkso knygos tema" + +msgid "Theme by the" +msgstr "Tema" + +msgid "Toggle navigation" +msgstr "Perjungti naršymą" + +msgid "next page" +msgstr "Kitas puslapis" + +msgid "open issue" +msgstr "atviras klausimas" + +msgid "previous page" +msgstr "Ankstesnis puslapis" + +msgid "repository" +msgstr "saugykla" + +msgid "suggest edit" +msgstr "pasiūlyti redaguoti" diff --git a/docs/zh-cn/latest/html/_static/locales/lv/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/lv/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..74aa4d8985d96a07c4c9be96f006f3b58d884342 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/lv/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/lv/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/lv/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..b741c2891d8734bb5065da5d0fabc73f84b32a95 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/lv/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Ar" + +msgid "By" +msgstr "Autors" + +msgid "Contents" +msgstr "Saturs" + +msgid "Copyright" +msgstr "Autortiesības" + +msgid "Download notebook file" +msgstr "Lejupielādēt piezīmju grāmatiņu" + +msgid "Download source file" +msgstr "Lejupielādēt avota failu" + +msgid "Download this page" +msgstr "Lejupielādējiet šo lapu" + +msgid "Edit this page" +msgstr "Rediģēt šo lapu" + +msgid "Fullscreen mode" +msgstr "Pilnekrāna režīms" + +msgid "Last updated on" +msgstr "Pēdējoreiz atjaunināts" + +msgid "Launch" +msgstr "Uzsākt" + +msgid "Open an issue" +msgstr "Atveriet problēmu" + +msgid "Print to PDF" +msgstr "Drukāt PDF formātā" + +msgid "Source repository" +msgstr "Avota krātuve" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa grāmatas tēma" + +msgid "Theme by the" +msgstr "Autora tēma" + +msgid "Toggle navigation" +msgstr "Pārslēgt navigāciju" + +msgid "next page" +msgstr "nākamā lapaspuse" + +msgid "open issue" +msgstr "atklāts jautājums" + +msgid "previous page" +msgstr "iepriekšējā lapa" + +msgid "repository" +msgstr "krātuve" + +msgid "suggest edit" +msgstr "ieteikt rediģēt" diff --git a/docs/zh-cn/latest/html/_static/locales/ml/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/ml/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..2736e8fcf6f9e923c2403307f0b366086d37b335 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/ml/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/ml/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/ml/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..bdad3de20cf829994ce039e3fec280fde71dbbd7 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/ml/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ml\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "എഴുതിയത്" + +msgid "By" +msgstr "എഴുതിയത്" + +msgid "Copyright" +msgstr "പകർപ്പവകാശം" + +msgid "Download notebook file" +msgstr "നോട്ട്ബുക്ക് ഫയൽ ഡൺലോഡ് ചെയ്യുക" + +msgid "Download source file" +msgstr "ഉറവിട ഫയൽ ഡൗൺലോഡുചെയ്യുക" + +msgid "Download this page" +msgstr "ഈ പേജ് ഡൗൺലോഡുചെയ്യുക" + +msgid "Edit this page" +msgstr "ഈ പേജ് എഡിറ്റുചെയ്യുക" + +msgid "Last updated on" +msgstr "അവസാനം അപ്‌ഡേറ്റുചെയ്‌തത്" + +msgid "Launch" +msgstr "സമാരംഭിക്കുക" + +msgid "Open an issue" +msgstr "ഒരു പ്രശ്നം തുറക്കുക" + +msgid "Print to PDF" +msgstr "PDF- ലേക്ക് പ്രിന്റുചെയ്യുക" + +msgid "Source repository" +msgstr "ഉറവിട ശേഖരം" + +msgid "Sphinx Book Theme" +msgstr "സ്ഫിങ്ക്സ് പുസ്തക തീം" + +msgid "Theme by the" +msgstr "പ്രമേയം" + +msgid "Toggle navigation" +msgstr "നാവിഗേഷൻ ടോഗിൾ ചെയ്യുക" + +msgid "next page" +msgstr "അടുത്ത പേജ്" + +msgid "open issue" +msgstr "തുറന്ന പ്രശ്നം" + +msgid "previous page" +msgstr "മുൻപത്തെ താൾ" + +msgid "suggest edit" +msgstr "എഡിറ്റുചെയ്യാൻ നിർദ്ദേശിക്കുക" diff --git a/docs/zh-cn/latest/html/_static/locales/mr/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/mr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..fe530100d7715cdc19a6f9db33a971665835f3c4 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/mr/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/mr/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/mr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..61bfad4d4c2ad487d6d1e142173a302110598471 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/mr/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "द्वारा" + +msgid "By" +msgstr "द्वारा" + +msgid "Copyright" +msgstr "कॉपीराइट" + +msgid "Download notebook file" +msgstr "नोटबुक फाईल डाउनलोड करा" + +msgid "Download source file" +msgstr "स्त्रोत फाइल डाउनलोड करा" + +msgid "Download this page" +msgstr "हे पृष्ठ डाउनलोड करा" + +msgid "Edit this page" +msgstr "हे पृष्ठ संपादित करा" + +msgid "Last updated on" +msgstr "अखेरचे अद्यतनित" + +msgid "Launch" +msgstr "लाँच करा" + +msgid "Open an issue" +msgstr "एक मुद्दा उघडा" + +msgid "Print to PDF" +msgstr "पीडीएफवर मुद्रित करा" + +msgid "Source repository" +msgstr "स्त्रोत भांडार" + +msgid "Sphinx Book Theme" +msgstr "स्फिंक्स बुक थीम" + +msgid "Theme by the" +msgstr "द्वारा थीम" + +msgid "Toggle navigation" +msgstr "नेव्हिगेशन टॉगल करा" + +msgid "next page" +msgstr "पुढील पृष्ठ" + +msgid "open issue" +msgstr "खुला मुद्दा" + +msgid "previous page" +msgstr "मागील पान" + +msgid "suggest edit" +msgstr "संपादन सुचवा" diff --git a/docs/zh-cn/latest/html/_static/locales/ms/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/ms/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..f02603fa2522a40060bd3f1b5d65052c77530de6 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/ms/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/ms/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/ms/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..ade6515a7778f375b805ee5e062e2f4f4aced3e2 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/ms/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Oleh" + +msgid "By" +msgstr "Oleh" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Download notebook file" +msgstr "Muat turun fail buku nota" + +msgid "Download source file" +msgstr "Muat turun fail sumber" + +msgid "Download this page" +msgstr "Muat turun halaman ini" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "Last updated on" +msgstr "Terakhir dikemas kini pada" + +msgid "Launch" +msgstr "Lancarkan" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "Theme by the" +msgstr "Tema oleh" + +msgid "Toggle navigation" +msgstr "Togol navigasi" + +msgid "next page" +msgstr "muka surat seterusnya" + +msgid "open issue" +msgstr "isu terbuka" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "suggest edit" +msgstr "cadangkan edit" diff --git a/docs/zh-cn/latest/html/_static/locales/nl/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/nl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..e59e7ecb308a7648cd23aa6342a9ad98a61d0009 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/nl/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/nl/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/nl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..e114611d69d2848ae98c09fd1722934a47363015 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/nl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Door de" + +msgid "By" +msgstr "Door" + +msgid "Contents" +msgstr "Inhoud" + +msgid "Copyright" +msgstr "auteursrechten" + +msgid "Download notebook file" +msgstr "Download notebookbestand" + +msgid "Download source file" +msgstr "Download het bronbestand" + +msgid "Download this page" +msgstr "Download deze pagina" + +msgid "Edit this page" +msgstr "bewerk deze pagina" + +msgid "Fullscreen mode" +msgstr "Volledig scherm" + +msgid "Last updated on" +msgstr "Laatst geupdate op" + +msgid "Launch" +msgstr "Lancering" + +msgid "Open an issue" +msgstr "Open een probleem" + +msgid "Print to PDF" +msgstr "Afdrukken naar pdf" + +msgid "Source repository" +msgstr "Bronopslagplaats" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-boekthema" + +msgid "Theme by the" +msgstr "Thema door de" + +msgid "Toggle navigation" +msgstr "Schakel navigatie" + +msgid "next page" +msgstr "volgende bladzijde" + +msgid "open issue" +msgstr "open probleem" + +msgid "previous page" +msgstr "vorige pagina" + +msgid "repository" +msgstr "repository" + +msgid "suggest edit" +msgstr "suggereren bewerken" diff --git a/docs/zh-cn/latest/html/_static/locales/no/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/no/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..6cd15c88de675226c00ca4d0430171075e5559ff Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/no/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/no/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/no/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..53fa9fc36624aac162611911208d11df6d158a53 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/no/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Ved" + +msgid "By" +msgstr "Av" + +msgid "Contents" +msgstr "Innhold" + +msgid "Copyright" +msgstr "opphavsrett" + +msgid "Download notebook file" +msgstr "Last ned notatbokfilen" + +msgid "Download source file" +msgstr "Last ned kildefilen" + +msgid "Download this page" +msgstr "Last ned denne siden" + +msgid "Edit this page" +msgstr "Rediger denne siden" + +msgid "Fullscreen mode" +msgstr "Fullskjerm-modus" + +msgid "Last updated on" +msgstr "Sist oppdatert den" + +msgid "Launch" +msgstr "Start" + +msgid "Open an issue" +msgstr "Åpne et problem" + +msgid "Print to PDF" +msgstr "Skriv ut til PDF" + +msgid "Source repository" +msgstr "Kildedepot" + +msgid "Sphinx Book Theme" +msgstr "Sphinx boktema" + +msgid "Theme by the" +msgstr "Tema av" + +msgid "Toggle navigation" +msgstr "Bytt navigasjon" + +msgid "next page" +msgstr "neste side" + +msgid "open issue" +msgstr "åpent nummer" + +msgid "previous page" +msgstr "forrige side" + +msgid "repository" +msgstr "oppbevaringssted" + +msgid "suggest edit" +msgstr "foreslå redigering" diff --git a/docs/zh-cn/latest/html/_static/locales/pl/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/pl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..9ebb584f77091f5666db4194ecd4f707396cbbca Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/pl/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/pl/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/pl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..a4822159fb96ad05f074b425d022ab2bf431172e --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/pl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Przez" + +msgid "By" +msgstr "Przez" + +msgid "Contents" +msgstr "Zawartość" + +msgid "Copyright" +msgstr "prawa autorskie" + +msgid "Download notebook file" +msgstr "Pobierz plik notatnika" + +msgid "Download source file" +msgstr "Pobierz plik źródłowy" + +msgid "Download this page" +msgstr "Pobierz tę stronę" + +msgid "Edit this page" +msgstr "Edytuj tę strone" + +msgid "Fullscreen mode" +msgstr "Pełny ekran" + +msgid "Last updated on" +msgstr "Ostatnia aktualizacja" + +msgid "Launch" +msgstr "Uruchomić" + +msgid "Open an issue" +msgstr "Otwórz problem" + +msgid "Print to PDF" +msgstr "Drukuj do PDF" + +msgid "Source repository" +msgstr "Repozytorium źródłowe" + +msgid "Sphinx Book Theme" +msgstr "Motyw książki Sphinx" + +msgid "Theme by the" +msgstr "Motyw autorstwa" + +msgid "Toggle navigation" +msgstr "Przełącz nawigację" + +msgid "next page" +msgstr "Następna strona" + +msgid "open issue" +msgstr "otwarty problem" + +msgid "previous page" +msgstr "Poprzednia strona" + +msgid "repository" +msgstr "magazyn" + +msgid "suggest edit" +msgstr "zaproponuj edycję" diff --git a/docs/zh-cn/latest/html/_static/locales/pt/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/pt/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..d0ddb8728e1d5ef72dddc1537f66aa32251a83c8 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/pt/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/pt/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/pt/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..bbc872d08420a4d150acbcf18da2221ae98b1ba2 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/pt/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Pelo" + +msgid "By" +msgstr "De" + +msgid "Contents" +msgstr "Conteúdo" + +msgid "Copyright" +msgstr "direito autoral" + +msgid "Download notebook file" +msgstr "Baixar arquivo de notebook" + +msgid "Download source file" +msgstr "Baixar arquivo fonte" + +msgid "Download this page" +msgstr "Baixe esta página" + +msgid "Edit this page" +msgstr "Edite essa página" + +msgid "Fullscreen mode" +msgstr "Modo tela cheia" + +msgid "Last updated on" +msgstr "Última atualização em" + +msgid "Launch" +msgstr "Lançamento" + +msgid "Open an issue" +msgstr "Abra um problema" + +msgid "Print to PDF" +msgstr "Imprimir em PDF" + +msgid "Source repository" +msgstr "Repositório fonte" + +msgid "Sphinx Book Theme" +msgstr "Tema do livro Sphinx" + +msgid "Theme by the" +msgstr "Tema por" + +msgid "Toggle navigation" +msgstr "Alternar de navegação" + +msgid "next page" +msgstr "próxima página" + +msgid "open issue" +msgstr "questão aberta" + +msgid "previous page" +msgstr "página anterior" + +msgid "repository" +msgstr "repositório" + +msgid "suggest edit" +msgstr "sugerir edição" diff --git a/docs/zh-cn/latest/html/_static/locales/ro/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/ro/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..3c36ab1df7c589ad82614599b8c91f072a25d4a6 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/ro/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/ro/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/ro/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..b9b8b4f39c4245763bcd31433e63249b780ac650 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/ro/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Langa" + +msgid "By" +msgstr "De" + +msgid "Contents" +msgstr "Cuprins" + +msgid "Copyright" +msgstr "Drepturi de autor" + +msgid "Download notebook file" +msgstr "Descărcați fișierul notebook" + +msgid "Download source file" +msgstr "Descărcați fișierul sursă" + +msgid "Download this page" +msgstr "Descarcă această pagină" + +msgid "Edit this page" +msgstr "Editați această pagină" + +msgid "Fullscreen mode" +msgstr "Modul ecran întreg" + +msgid "Last updated on" +msgstr "Ultima actualizare la" + +msgid "Launch" +msgstr "Lansa" + +msgid "Open an issue" +msgstr "Deschideți o problemă" + +msgid "Print to PDF" +msgstr "Imprimați în PDF" + +msgid "Source repository" +msgstr "Depozit sursă" + +msgid "Sphinx Book Theme" +msgstr "Tema Sphinx Book" + +msgid "Theme by the" +msgstr "Tema de" + +msgid "Toggle navigation" +msgstr "Comutare navigare" + +msgid "next page" +msgstr "pagina următoare" + +msgid "open issue" +msgstr "problema deschisă" + +msgid "previous page" +msgstr "pagina anterioară" + +msgid "repository" +msgstr "repertoriu" + +msgid "suggest edit" +msgstr "sugerează editare" diff --git a/docs/zh-cn/latest/html/_static/locales/ru/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/ru/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..5ea2e5c9f176e3db42d78d2e890997e092a8db84 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/ru/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/ru/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/ru/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..e0f355514abd9a60591772f603e06d165ca4b20f --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/ru/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Посредством" + +msgid "By" +msgstr "Автор:" + +msgid "Contents" +msgstr "Содержание" + +msgid "Copyright" +msgstr "авторское право" + +msgid "Download notebook file" +msgstr "Скачать файл записной книжки" + +msgid "Download source file" +msgstr "Скачать исходный файл" + +msgid "Download this page" +msgstr "Загрузите эту страницу" + +msgid "Edit this page" +msgstr "Редактировать эту страницу" + +msgid "Fullscreen mode" +msgstr "Полноэкранный режим" + +msgid "Last updated on" +msgstr "Последнее обновление" + +msgid "Launch" +msgstr "Запуск" + +msgid "Open an issue" +msgstr "Открыть вопрос" + +msgid "Print to PDF" +msgstr "Распечатать в PDF" + +msgid "Source repository" +msgstr "Исходный репозиторий" + +msgid "Sphinx Book Theme" +msgstr "Тема книги Сфинкс" + +msgid "Theme by the" +msgstr "Тема от" + +msgid "Toggle navigation" +msgstr "Переключить навигацию" + +msgid "next page" +msgstr "Следующая страница" + +msgid "open issue" +msgstr "открытый вопрос" + +msgid "previous page" +msgstr "Предыдущая страница" + +msgid "repository" +msgstr "хранилище" + +msgid "suggest edit" +msgstr "предложить редактировать" diff --git a/docs/zh-cn/latest/html/_static/locales/sk/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/sk/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..59bd0ddfa341477cf5ccfdc88f4c3e6127046f7a Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/sk/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/sk/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/sk/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..4b5225a36b178d4e1eed3516d0c4c2aaea3a101e --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/sk/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Podľa" + +msgid "By" +msgstr "Autor:" + +msgid "Contents" +msgstr "Obsah" + +msgid "Copyright" +msgstr "Autorské práva" + +msgid "Download notebook file" +msgstr "Stiahnite si zošit" + +msgid "Download source file" +msgstr "Stiahnite si zdrojový súbor" + +msgid "Download this page" +msgstr "Stiahnite si túto stránku" + +msgid "Edit this page" +msgstr "Upraviť túto stránku" + +msgid "Fullscreen mode" +msgstr "Režim celej obrazovky" + +msgid "Last updated on" +msgstr "Posledná aktualizácia dňa" + +msgid "Launch" +msgstr "Spustiť" + +msgid "Open an issue" +msgstr "Otvorte problém" + +msgid "Print to PDF" +msgstr "Tlač do PDF" + +msgid "Source repository" +msgstr "Zdrojové úložisko" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "Theme by the" +msgstr "Téma od" + +msgid "Toggle navigation" +msgstr "Prepnúť navigáciu" + +msgid "next page" +msgstr "ďalšia strana" + +msgid "open issue" +msgstr "otvorené vydanie" + +msgid "previous page" +msgstr "predchádzajúca strana" + +msgid "repository" +msgstr "Úložisko" + +msgid "suggest edit" +msgstr "navrhnúť úpravu" diff --git a/docs/zh-cn/latest/html/_static/locales/sl/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/sl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..87bf26de683cb18c73bd23c2b4c57ef6a02545ec Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/sl/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/sl/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/sl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..45592e71cf36b9fdea69ef10f9c18617474b1860 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/sl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Avtor" + +msgid "By" +msgstr "Avtor" + +msgid "Contents" +msgstr "Vsebina" + +msgid "Copyright" +msgstr "avtorske pravice" + +msgid "Download notebook file" +msgstr "Prenesite datoteko zvezka" + +msgid "Download source file" +msgstr "Prenesite izvorno datoteko" + +msgid "Download this page" +msgstr "Prenesite to stran" + +msgid "Edit this page" +msgstr "Uredite to stran" + +msgid "Fullscreen mode" +msgstr "Celozaslonski način" + +msgid "Last updated on" +msgstr "Nazadnje posodobljeno dne" + +msgid "Launch" +msgstr "Kosilo" + +msgid "Open an issue" +msgstr "Odprite številko" + +msgid "Print to PDF" +msgstr "Natisni v PDF" + +msgid "Source repository" +msgstr "Izvorno skladišče" + +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" + +msgid "Theme by the" +msgstr "Tema avtorja" + +msgid "Toggle navigation" +msgstr "Preklopi navigacijo" + +msgid "next page" +msgstr "Naslednja stran" + +msgid "open issue" +msgstr "odprto vprašanje" + +msgid "previous page" +msgstr "Prejšnja stran" + +msgid "repository" +msgstr "odlagališče" + +msgid "suggest edit" +msgstr "predlagajte urejanje" diff --git a/docs/zh-cn/latest/html/_static/locales/sr/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/sr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..ec740f4852f3973fa72ed0c7f7cf59273b8dba41 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/sr/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/sr/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/sr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..4ddf693d150c1352e3a3f3fa6f7ab2a3abc4c8d4 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/sr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Од" + +msgid "By" +msgstr "Од стране" + +msgid "Contents" +msgstr "Садржај" + +msgid "Copyright" +msgstr "Ауторско право" + +msgid "Download notebook file" +msgstr "Преузмите датотеку бележнице" + +msgid "Download source file" +msgstr "Преузми изворну датотеку" + +msgid "Download this page" +msgstr "Преузмите ову страницу" + +msgid "Edit this page" +msgstr "Уредите ову страницу" + +msgid "Fullscreen mode" +msgstr "Режим целог екрана" + +msgid "Last updated on" +msgstr "Последње ажурирање" + +msgid "Launch" +msgstr "Лансирање" + +msgid "Open an issue" +msgstr "Отворите издање" + +msgid "Print to PDF" +msgstr "Испис у ПДФ" + +msgid "Source repository" +msgstr "Изворно спремиште" + +msgid "Sphinx Book Theme" +msgstr "Тема књиге Спхинк" + +msgid "Theme by the" +msgstr "Тхеме би" + +msgid "Toggle navigation" +msgstr "Укључи / искључи навигацију" + +msgid "next page" +msgstr "Следећа страна" + +msgid "open issue" +msgstr "отворено издање" + +msgid "previous page" +msgstr "Претходна страница" + +msgid "repository" +msgstr "спремиште" + +msgid "suggest edit" +msgstr "предложи уређивање" diff --git a/docs/zh-cn/latest/html/_static/locales/sv/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/sv/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..b07dc76ff21128244172d2e415cc899555d8b49d Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/sv/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/sv/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/sv/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..a5587a567863f6bd07ff9913f33766e234ba04b3 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/sv/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Av den" + +msgid "By" +msgstr "Av" + +msgid "Contents" +msgstr "Innehåll" + +msgid "Copyright" +msgstr "Upphovsrätt" + +msgid "Download notebook file" +msgstr "Ladda ner notebook-fil" + +msgid "Download source file" +msgstr "Ladda ner källfil" + +msgid "Download this page" +msgstr "Ladda ner den här sidan" + +msgid "Edit this page" +msgstr "Redigera den här sidan" + +msgid "Fullscreen mode" +msgstr "Fullskärmsläge" + +msgid "Last updated on" +msgstr "Senast uppdaterad den" + +msgid "Launch" +msgstr "Öppna" + +msgid "Open an issue" +msgstr "Öppna en problemrapport" + +msgid "Print to PDF" +msgstr "Skriv ut till PDF" + +msgid "Source repository" +msgstr "Källkodsrepositorium" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Boktema" + +msgid "Theme by the" +msgstr "Tema av" + +msgid "Toggle navigation" +msgstr "Växla navigering" + +msgid "next page" +msgstr "nästa sida" + +msgid "open issue" +msgstr "öppna problemrapport" + +msgid "previous page" +msgstr "föregående sida" + +msgid "repository" +msgstr "repositorium" + +msgid "suggest edit" +msgstr "föreslå ändring" diff --git a/docs/zh-cn/latest/html/_static/locales/ta/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/ta/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..29f52e1f6f1ec96aceb0f883d8ccc82c23eb35c2 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/ta/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/ta/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/ta/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..fb871e23e56677d0982caa4f18f713eaeb43a13b --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/ta/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "மூலம்" + +msgid "By" +msgstr "வழங்கியவர்" + +msgid "Copyright" +msgstr "பதிப்புரிமை" + +msgid "Download notebook file" +msgstr "நோட்புக் கோப்பைப் பதிவிறக்கவும்" + +msgid "Download source file" +msgstr "மூல கோப்பைப் பதிவிறக்குக" + +msgid "Download this page" +msgstr "இந்தப் பக்கத்தைப் பதிவிறக்கவும்" + +msgid "Edit this page" +msgstr "இந்தப் பக்கத்தைத் திருத்தவும்" + +msgid "Last updated on" +msgstr "கடைசியாக புதுப்பிக்கப்பட்டது" + +msgid "Launch" +msgstr "தொடங்க" + +msgid "Open an issue" +msgstr "சிக்கலைத் திறக்கவும்" + +msgid "Print to PDF" +msgstr "PDF இல் அச்சிடுக" + +msgid "Source repository" +msgstr "மூல களஞ்சியம்" + +msgid "Sphinx Book Theme" +msgstr "ஸ்பிங்க்ஸ் புத்தக தீம்" + +msgid "Theme by the" +msgstr "வழங்கிய தீம்" + +msgid "Toggle navigation" +msgstr "வழிசெலுத்தலை நிலைமாற்று" + +msgid "next page" +msgstr "அடுத்த பக்கம்" + +msgid "open issue" +msgstr "திறந்த பிரச்சினை" + +msgid "previous page" +msgstr "முந்தைய பக்கம்" + +msgid "suggest edit" +msgstr "திருத்த பரிந்துரைக்கவும்" diff --git a/docs/zh-cn/latest/html/_static/locales/te/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/te/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..0a5f4b46adfda1551ae6791c3c3782525b61be04 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/te/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/te/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/te/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..22ab77c157570f6d7203ab411e1429d03b580d67 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/te/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "ద్వారా" + +msgid "By" +msgstr "ద్వారా" + +msgid "Copyright" +msgstr "కాపీరైట్" + +msgid "Download notebook file" +msgstr "నోట్బుక్ ఫైల్ను డౌన్లోడ్ చేయండి" + +msgid "Download source file" +msgstr "మూల ఫైల్‌ను డౌన్‌లోడ్ చేయండి" + +msgid "Download this page" +msgstr "ఈ పేజీని డౌన్‌లోడ్ చేయండి" + +msgid "Edit this page" +msgstr "ఈ పేజీని సవరించండి" + +msgid "Last updated on" +msgstr "చివరిగా నవీకరించబడింది" + +msgid "Launch" +msgstr "ప్రారంభించండి" + +msgid "Open an issue" +msgstr "సమస్యను తెరవండి" + +msgid "Print to PDF" +msgstr "PDF కి ముద్రించండి" + +msgid "Source repository" +msgstr "మూల రిపోజిటరీ" + +msgid "Sphinx Book Theme" +msgstr "సింహిక పుస్తక థీమ్" + +msgid "Theme by the" +msgstr "ద్వారా థీమ్" + +msgid "Toggle navigation" +msgstr "నావిగేషన్‌ను టోగుల్ చేయండి" + +msgid "next page" +msgstr "తరువాతి పేజీ" + +msgid "open issue" +msgstr "ఓపెన్ ఇష్యూ" + +msgid "previous page" +msgstr "ముందు పేజి" + +msgid "suggest edit" +msgstr "సవరించమని సూచించండి" diff --git a/docs/zh-cn/latest/html/_static/locales/tg/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/tg/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..b21c6c6340194fdf35f7e5660deb42479c8dbff9 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/tg/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/tg/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/tg/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..e499352dbefe7e7785bb39ff10aaa503b206f3e7 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/tg/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Бо" + +msgid "By" +msgstr "Бо" + +msgid "Contents" +msgstr "Мундариҷа" + +msgid "Copyright" +msgstr "Ҳуқуқи муаллиф" + +msgid "Download notebook file" +msgstr "Файли дафтарро зеркашӣ кунед" + +msgid "Download source file" +msgstr "Файли манбаъро зеркашӣ кунед" + +msgid "Download this page" +msgstr "Ин саҳифаро зеркашӣ кунед" + +msgid "Edit this page" +msgstr "Ин саҳифаро таҳрир кунед" + +msgid "Fullscreen mode" +msgstr "Ҳолати экрани пурра" + +msgid "Last updated on" +msgstr "Last навсозӣ дар" + +msgid "Launch" +msgstr "Оғоз" + +msgid "Open an issue" +msgstr "Масъаларо кушоед" + +msgid "Print to PDF" +msgstr "Чоп ба PDF" + +msgid "Source repository" +msgstr "Анбори манбаъ" + +msgid "Sphinx Book Theme" +msgstr "Сфинкс Мавзӯи китоб" + +msgid "Theme by the" +msgstr "Мавзӯъи аз" + +msgid "Toggle navigation" +msgstr "Гузаришро иваз кунед" + +msgid "next page" +msgstr "саҳифаи оянда" + +msgid "open issue" +msgstr "барориши кушод" + +msgid "previous page" +msgstr "саҳифаи қаблӣ" + +msgid "repository" +msgstr "анбор" + +msgid "suggest edit" +msgstr "пешниҳод вироиш" diff --git a/docs/zh-cn/latest/html/_static/locales/th/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/th/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..abede98aa11b163e580a26b545980ace31e61ccf Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/th/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/th/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/th/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..6f0103ea28d86e8b4539e2a0daf50775d4d775f7 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/th/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "โดย" + +msgid "By" +msgstr "โดย" + +msgid "Contents" +msgstr "สารบัญ" + +msgid "Copyright" +msgstr "ลิขสิทธิ์" + +msgid "Download notebook file" +msgstr "ดาวน์โหลดไฟล์สมุดบันทึก" + +msgid "Download source file" +msgstr "ดาวน์โหลดไฟล์ต้นฉบับ" + +msgid "Download this page" +msgstr "ดาวน์โหลดหน้านี้" + +msgid "Edit this page" +msgstr "แก้ไขหน้านี้" + +msgid "Fullscreen mode" +msgstr "โหมดเต็มหน้าจอ" + +msgid "Last updated on" +msgstr "ปรับปรุงล่าสุดเมื่อ" + +msgid "Launch" +msgstr "เปิด" + +msgid "Open an issue" +msgstr "เปิดปัญหา" + +msgid "Print to PDF" +msgstr "พิมพ์เป็น PDF" + +msgid "Source repository" +msgstr "ที่เก็บซอร์ส" + +msgid "Sphinx Book Theme" +msgstr "ธีมหนังสือสฟิงซ์" + +msgid "Theme by the" +msgstr "ธีมโดย" + +msgid "Toggle navigation" +msgstr "ไม่ต้องสลับช่องทาง" + +msgid "next page" +msgstr "หน้าต่อไป" + +msgid "open issue" +msgstr "เปิดปัญหา" + +msgid "previous page" +msgstr "หน้าที่แล้ว" + +msgid "repository" +msgstr "ที่เก็บ" + +msgid "suggest edit" +msgstr "แนะนำแก้ไข" diff --git a/docs/zh-cn/latest/html/_static/locales/tl/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/tl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..8df1b73310e0c606251d1abff7e6033d1f6b273f Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/tl/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/tl/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/tl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..dbeb2565d3caddb7aa0845510a31aa2c1c104205 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/tl/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Sa pamamagitan ng" + +msgid "By" +msgstr "Ni" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download notebook file" +msgstr "Mag-download ng file ng notebook" + +msgid "Download source file" +msgstr "Mag-download ng file ng pinagmulan" + +msgid "Download this page" +msgstr "I-download ang pahinang ito" + +msgid "Edit this page" +msgstr "I-edit ang pahinang ito" + +msgid "Last updated on" +msgstr "Huling na-update noong" + +msgid "Launch" +msgstr "Ilunsad" + +msgid "Open an issue" +msgstr "Magbukas ng isyu" + +msgid "Print to PDF" +msgstr "I-print sa PDF" + +msgid "Source repository" +msgstr "Pinagmulan ng imbakan" + +msgid "Sphinx Book Theme" +msgstr "Tema ng Sphinx Book" + +msgid "Theme by the" +msgstr "Tema ng" + +msgid "Toggle navigation" +msgstr "I-toggle ang pag-navigate" + +msgid "next page" +msgstr "Susunod na pahina" + +msgid "open issue" +msgstr "bukas na isyu" + +msgid "previous page" +msgstr "Nakaraang pahina" + +msgid "suggest edit" +msgstr "iminumungkahi i-edit" diff --git a/docs/zh-cn/latest/html/_static/locales/tr/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/tr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..029ae18afb5360a8c238a052e8d3971761759d3d Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/tr/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/tr/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/tr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..610c1ab0262f28feafc729404d26f37abd59be17 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/tr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Tarafından" + +msgid "By" +msgstr "Tarafından" + +msgid "Contents" +msgstr "İçindekiler" + +msgid "Copyright" +msgstr "Telif hakkı" + +msgid "Download notebook file" +msgstr "Defter dosyasını indirin" + +msgid "Download source file" +msgstr "Kaynak dosyayı indirin" + +msgid "Download this page" +msgstr "Bu sayfayı indirin" + +msgid "Edit this page" +msgstr "Bu sayfayı düzenle" + +msgid "Fullscreen mode" +msgstr "Tam ekran modu" + +msgid "Last updated on" +msgstr "Son güncelleme tarihi" + +msgid "Launch" +msgstr "Başlatmak" + +msgid "Open an issue" +msgstr "Bir sorunu açın" + +msgid "Print to PDF" +msgstr "PDF olarak yazdır" + +msgid "Source repository" +msgstr "Kaynak kod deposu" + +msgid "Sphinx Book Theme" +msgstr "Sfenks Kitap Teması" + +msgid "Theme by the" +msgstr "Tarafından tema" + +msgid "Toggle navigation" +msgstr "Gezinmeyi değiştir" + +msgid "next page" +msgstr "sonraki Sayfa" + +msgid "open issue" +msgstr "Açık konu" + +msgid "previous page" +msgstr "önceki sayfa" + +msgid "repository" +msgstr "depo" + +msgid "suggest edit" +msgstr "düzenleme öner" diff --git a/docs/zh-cn/latest/html/_static/locales/uk/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/uk/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..16ab78909cfbaba7fa199f47fdfc2934426ac699 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/uk/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/uk/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/uk/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..8ae61c4851cc01827fc7ff795e711ab23cef1b5b --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/uk/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "По" + +msgid "By" +msgstr "Автор" + +msgid "Contents" +msgstr "Зміст" + +msgid "Copyright" +msgstr "Авторське право" + +msgid "Download notebook file" +msgstr "Завантажте файл блокнота" + +msgid "Download source file" +msgstr "Завантажити вихідний файл" + +msgid "Download this page" +msgstr "Завантажте цю сторінку" + +msgid "Edit this page" +msgstr "Редагувати цю сторінку" + +msgid "Fullscreen mode" +msgstr "Повноекранний режим" + +msgid "Last updated on" +msgstr "Останнє оновлення:" + +msgid "Launch" +msgstr "Запуск" + +msgid "Open an issue" +msgstr "Відкрийте випуск" + +msgid "Print to PDF" +msgstr "Друк у форматі PDF" + +msgid "Source repository" +msgstr "Джерело сховища" + +msgid "Sphinx Book Theme" +msgstr "Тема книги \"Сфінкс\"" + +msgid "Theme by the" +msgstr "Тема від" + +msgid "Toggle navigation" +msgstr "Переключити навігацію" + +msgid "next page" +msgstr "Наступна сторінка" + +msgid "open issue" +msgstr "відкритий випуск" + +msgid "previous page" +msgstr "Попередня сторінка" + +msgid "repository" +msgstr "сховище" + +msgid "suggest edit" +msgstr "запропонувати редагувати" diff --git a/docs/zh-cn/latest/html/_static/locales/ur/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/ur/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..de8c84b935ed5c3db23e304015d45b638a3d2db3 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/ur/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/ur/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/ur/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..63018eaecf6e2b6fb3322282c7f11c305fb4ed06 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/ur/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "کی طرف" + +msgid "By" +msgstr "بذریعہ" + +msgid "Copyright" +msgstr "کاپی رائٹ" + +msgid "Download notebook file" +msgstr "نوٹ بک فائل ڈاؤن لوڈ کریں" + +msgid "Download source file" +msgstr "سورس فائل ڈاؤن لوڈ کریں" + +msgid "Download this page" +msgstr "اس صفحے کو ڈاؤن لوڈ کریں" + +msgid "Edit this page" +msgstr "اس صفحے میں ترمیم کریں" + +msgid "Last updated on" +msgstr "آخری بار تازہ کاری ہوئی" + +msgid "Launch" +msgstr "لانچ کریں" + +msgid "Open an issue" +msgstr "ایک مسئلہ کھولیں" + +msgid "Print to PDF" +msgstr "پی ڈی ایف پرنٹ کریں" + +msgid "Source repository" +msgstr "ماخذ ذخیرہ" + +msgid "Sphinx Book Theme" +msgstr "سپنکس بک تھیم" + +msgid "Theme by the" +msgstr "کے ذریعہ تھیم" + +msgid "Toggle navigation" +msgstr "نیویگیشن ٹوگل کریں" + +msgid "next page" +msgstr "اگلا صفحہ" + +msgid "open issue" +msgstr "کھلا مسئلہ" + +msgid "previous page" +msgstr "سابقہ ​​صفحہ" + +msgid "suggest edit" +msgstr "ترمیم کی تجویز کریں" diff --git a/docs/zh-cn/latest/html/_static/locales/vi/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/vi/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..2bb32555c3ea0dab08ed37b71cb863fbe75698c6 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/vi/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/vi/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/vi/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..ac91b0f16c66f6cd8f78ee8315db0f2d3c717395 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/vi/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "Bằng" + +msgid "By" +msgstr "Bởi" + +msgid "Contents" +msgstr "Nội dung" + +msgid "Copyright" +msgstr "Bản quyền" + +msgid "Download notebook file" +msgstr "Tải xuống tệp sổ tay" + +msgid "Download source file" +msgstr "Tải xuống tệp nguồn" + +msgid "Download this page" +msgstr "Tải xuống trang này" + +msgid "Edit this page" +msgstr "chỉnh sửa trang này" + +msgid "Fullscreen mode" +msgstr "Chế độ toàn màn hình" + +msgid "Last updated on" +msgstr "Cập nhật lần cuối vào" + +msgid "Launch" +msgstr "Phóng" + +msgid "Open an issue" +msgstr "Mở một vấn đề" + +msgid "Print to PDF" +msgstr "In sang PDF" + +msgid "Source repository" +msgstr "Kho nguồn" + +msgid "Sphinx Book Theme" +msgstr "Chủ đề sách nhân sư" + +msgid "Theme by the" +msgstr "Chủ đề của" + +msgid "Toggle navigation" +msgstr "Chuyển đổi điều hướng thành" + +msgid "next page" +msgstr "Trang tiếp theo" + +msgid "open issue" +msgstr "vấn đề mở" + +msgid "previous page" +msgstr "trang trước" + +msgid "repository" +msgstr "kho" + +msgid "suggest edit" +msgstr "đề nghị chỉnh sửa" diff --git a/docs/zh-cn/latest/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..0e3235d090c2a05c0e278d38520f0437847dc79f Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..ff1c9383c819670a3e4e1542aa18f90f4f0a9f7d --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "作者:" + +msgid "By" +msgstr "作者:" + +msgid "Contents" +msgstr "目录" + +msgid "Copyright" +msgstr "版权" + +msgid "Download notebook file" +msgstr "下载笔记本文件" + +msgid "Download source file" +msgstr "下载源文件" + +msgid "Download this page" +msgstr "下载此页面" + +msgid "Edit this page" +msgstr "编辑此页面" + +msgid "Fullscreen mode" +msgstr "全屏模式" + +msgid "Last updated on" +msgstr "上次更新时间:" + +msgid "Launch" +msgstr "启动" + +msgid "Open an issue" +msgstr "创建议题" + +msgid "Print to PDF" +msgstr "列印成 PDF" + +msgid "Source repository" +msgstr "源码库" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 主题" + +msgid "Theme by the" +msgstr "主题作者:" + +msgid "Toggle navigation" +msgstr "显示或隐藏导航栏" + +msgid "next page" +msgstr "下一页" + +msgid "open issue" +msgstr "创建议题" + +msgid "previous page" +msgstr "上一页" + +msgid "repository" +msgstr "仓库" + +msgid "suggest edit" +msgstr "提出修改建议" diff --git a/docs/zh-cn/latest/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo b/docs/zh-cn/latest/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..9116fa95d0a752665e0f1d59857a32abfc0c6bce Binary files /dev/null and b/docs/zh-cn/latest/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo differ diff --git a/docs/zh-cn/latest/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.po b/docs/zh-cn/latest/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000000000000000000000000000000000000..f2b300fa87fdbc0006982e0c5ad44c67b31bd7b5 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "By the" +msgstr "作者:" + +msgid "By" +msgstr "作者:" + +msgid "Contents" +msgstr "目錄" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download notebook file" +msgstr "下載 Notebook 檔案" + +msgid "Download source file" +msgstr "下載原始檔" + +msgid "Download this page" +msgstr "下載此頁面" + +msgid "Edit this page" +msgstr "編輯此頁面" + +msgid "Fullscreen mode" +msgstr "全螢幕模式" + +msgid "Last updated on" +msgstr "最後更新時間:" + +msgid "Launch" +msgstr "啟動" + +msgid "Open an issue" +msgstr "開啟議題" + +msgid "Print to PDF" +msgstr "列印成 PDF" + +msgid "Source repository" +msgstr "來源儲存庫" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 佈景主題" + +msgid "Theme by the" +msgstr "佈景主題作者:" + +msgid "Toggle navigation" +msgstr "顯示或隱藏導覽列" + +msgid "next page" +msgstr "下一頁" + +msgid "open issue" +msgstr "公開的問題" + +msgid "previous page" +msgstr "上一頁" + +msgid "repository" +msgstr "儲存庫" + +msgid "suggest edit" +msgstr "提出修改建議" diff --git a/docs/zh-cn/latest/html/_static/logo-small.png b/docs/zh-cn/latest/html/_static/logo-small.png new file mode 100644 index 0000000000000000000000000000000000000000..19eefed75012879be364ee3d4385da3de1a3e102 Binary files /dev/null and b/docs/zh-cn/latest/html/_static/logo-small.png differ diff --git a/docs/zh-cn/latest/html/_static/minus.png b/docs/zh-cn/latest/html/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d Binary files /dev/null and b/docs/zh-cn/latest/html/_static/minus.png differ diff --git a/docs/zh-cn/latest/html/_static/plus.png b/docs/zh-cn/latest/html/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d Binary files /dev/null and b/docs/zh-cn/latest/html/_static/plus.png differ diff --git a/docs/zh-cn/latest/html/_static/pygments.css b/docs/zh-cn/latest/html/_static/pygments.css new file mode 100644 index 0000000000000000000000000000000000000000..d7dd57783f98af8efa39d5bdb93a7a7bbe6a8695 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/pygments.css @@ -0,0 +1,152 @@ +html[data-theme="light"] .highlight pre { line-height: 125%; } +html[data-theme="light"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight .hll { background-color: #fae4c2 } +html[data-theme="light"] .highlight { background: #fefefe; color: #080808 } +html[data-theme="light"] .highlight .c { color: #515151 } /* Comment */ +html[data-theme="light"] .highlight .err { color: #A12236 } /* Error */ +html[data-theme="light"] .highlight .k { color: #6730C5 } /* Keyword */ +html[data-theme="light"] .highlight .l { color: #7F4707 } /* Literal */ +html[data-theme="light"] .highlight .n { color: #080808 } /* Name */ +html[data-theme="light"] .highlight .o { color: #00622F } /* Operator */ +html[data-theme="light"] .highlight .p { color: #080808 } /* Punctuation */ +html[data-theme="light"] .highlight .ch { color: #515151 } /* Comment.Hashbang */ +html[data-theme="light"] .highlight .cm { color: #515151 } /* Comment.Multiline */ +html[data-theme="light"] .highlight .cp { color: #515151 } /* Comment.Preproc */ +html[data-theme="light"] .highlight .cpf { color: #515151 } /* Comment.PreprocFile */ +html[data-theme="light"] .highlight .c1 { color: #515151 } /* Comment.Single */ +html[data-theme="light"] .highlight .cs { color: #515151 } /* Comment.Special */ +html[data-theme="light"] .highlight .gd { color: #005B82 } /* Generic.Deleted */ +html[data-theme="light"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="light"] .highlight .gh { color: #005B82 } /* Generic.Heading */ +html[data-theme="light"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="light"] .highlight .gu { color: #005B82 } /* Generic.Subheading */ +html[data-theme="light"] .highlight .kc { color: #6730C5 } /* Keyword.Constant */ +html[data-theme="light"] .highlight .kd { color: #6730C5 } /* Keyword.Declaration */ +html[data-theme="light"] .highlight .kn { color: #6730C5 } /* Keyword.Namespace */ +html[data-theme="light"] .highlight .kp { color: #6730C5 } /* Keyword.Pseudo */ +html[data-theme="light"] .highlight .kr { color: #6730C5 } /* Keyword.Reserved */ +html[data-theme="light"] .highlight .kt { color: #7F4707 } /* Keyword.Type */ +html[data-theme="light"] .highlight .ld { color: #7F4707 } /* Literal.Date */ +html[data-theme="light"] .highlight .m { color: #7F4707 } /* Literal.Number */ +html[data-theme="light"] .highlight .s { color: #00622F } /* Literal.String */ +html[data-theme="light"] .highlight .na { color: #912583 } /* Name.Attribute */ +html[data-theme="light"] .highlight .nb { color: #7F4707 } /* Name.Builtin */ +html[data-theme="light"] .highlight .nc { color: #005B82 } /* Name.Class */ +html[data-theme="light"] .highlight .no { color: #005B82 } /* Name.Constant */ +html[data-theme="light"] .highlight .nd { color: #7F4707 } /* Name.Decorator */ +html[data-theme="light"] .highlight .ni { color: #00622F } /* Name.Entity */ +html[data-theme="light"] .highlight .ne { color: #6730C5 } /* Name.Exception */ +html[data-theme="light"] .highlight .nf { color: #005B82 } /* Name.Function */ +html[data-theme="light"] .highlight .nl { color: #7F4707 } /* Name.Label */ +html[data-theme="light"] .highlight .nn { color: #080808 } /* Name.Namespace */ +html[data-theme="light"] .highlight .nx { color: #080808 } /* Name.Other */ +html[data-theme="light"] .highlight .py { color: #005B82 } /* Name.Property */ +html[data-theme="light"] .highlight .nt { color: #005B82 } /* Name.Tag */ +html[data-theme="light"] .highlight .nv { color: #A12236 } /* Name.Variable */ +html[data-theme="light"] .highlight .ow { color: #6730C5 } /* Operator.Word */ +html[data-theme="light"] .highlight .pm { color: #080808 } /* Punctuation.Marker */ +html[data-theme="light"] .highlight .w { color: #080808 } /* Text.Whitespace */ +html[data-theme="light"] .highlight .mb { color: #7F4707 } /* Literal.Number.Bin */ +html[data-theme="light"] .highlight .mf { color: #7F4707 } /* Literal.Number.Float */ +html[data-theme="light"] .highlight .mh { color: #7F4707 } /* Literal.Number.Hex */ +html[data-theme="light"] .highlight .mi { color: #7F4707 } /* Literal.Number.Integer */ +html[data-theme="light"] .highlight .mo { color: #7F4707 } /* Literal.Number.Oct */ +html[data-theme="light"] .highlight .sa { color: #00622F } /* Literal.String.Affix */ +html[data-theme="light"] .highlight .sb { color: #00622F } /* Literal.String.Backtick */ +html[data-theme="light"] .highlight .sc { color: #00622F } /* Literal.String.Char */ +html[data-theme="light"] .highlight .dl { color: #00622F } /* Literal.String.Delimiter */ +html[data-theme="light"] .highlight .sd { color: #00622F } /* Literal.String.Doc */ +html[data-theme="light"] .highlight .s2 { color: #00622F } /* Literal.String.Double */ +html[data-theme="light"] .highlight .se { color: #00622F } /* Literal.String.Escape */ +html[data-theme="light"] .highlight .sh { color: #00622F } /* Literal.String.Heredoc */ +html[data-theme="light"] .highlight .si { color: #00622F } /* Literal.String.Interpol */ +html[data-theme="light"] .highlight .sx { color: #00622F } /* Literal.String.Other */ +html[data-theme="light"] .highlight .sr { color: #A12236 } /* Literal.String.Regex */ +html[data-theme="light"] .highlight .s1 { color: #00622F } /* Literal.String.Single */ +html[data-theme="light"] .highlight .ss { color: #005B82 } /* Literal.String.Symbol */ +html[data-theme="light"] .highlight .bp { color: #7F4707 } /* Name.Builtin.Pseudo */ +html[data-theme="light"] .highlight .fm { color: #005B82 } /* Name.Function.Magic */ +html[data-theme="light"] .highlight .vc { color: #A12236 } /* Name.Variable.Class */ +html[data-theme="light"] .highlight .vg { color: #A12236 } /* Name.Variable.Global */ +html[data-theme="light"] .highlight .vi { color: #A12236 } /* Name.Variable.Instance */ +html[data-theme="light"] .highlight .vm { color: #7F4707 } /* Name.Variable.Magic */ +html[data-theme="light"] .highlight .il { color: #7F4707 } /* Literal.Number.Integer.Long */ +html[data-theme="dark"] .highlight pre { line-height: 125%; } +html[data-theme="dark"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight .hll { background-color: #ffd9002e } +html[data-theme="dark"] .highlight { background: #2b2b2b; color: #F8F8F2 } +html[data-theme="dark"] .highlight .c { color: #FFD900 } /* Comment */ +html[data-theme="dark"] .highlight .err { color: #FFA07A } /* Error */ +html[data-theme="dark"] .highlight .k { color: #DCC6E0 } /* Keyword */ +html[data-theme="dark"] .highlight .l { color: #FFD900 } /* Literal */ +html[data-theme="dark"] .highlight .n { color: #F8F8F2 } /* Name */ +html[data-theme="dark"] .highlight .o { color: #ABE338 } /* Operator */ +html[data-theme="dark"] .highlight .p { color: #F8F8F2 } /* Punctuation */ +html[data-theme="dark"] .highlight .ch { color: #FFD900 } /* Comment.Hashbang */ +html[data-theme="dark"] .highlight .cm { color: #FFD900 } /* Comment.Multiline */ +html[data-theme="dark"] .highlight .cp { color: #FFD900 } /* Comment.Preproc */ +html[data-theme="dark"] .highlight .cpf { color: #FFD900 } /* Comment.PreprocFile */ +html[data-theme="dark"] .highlight .c1 { color: #FFD900 } /* Comment.Single */ +html[data-theme="dark"] .highlight .cs { color: #FFD900 } /* Comment.Special */ +html[data-theme="dark"] .highlight .gd { color: #00E0E0 } /* Generic.Deleted */ +html[data-theme="dark"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="dark"] .highlight .gh { color: #00E0E0 } /* Generic.Heading */ +html[data-theme="dark"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="dark"] .highlight .gu { color: #00E0E0 } /* Generic.Subheading */ +html[data-theme="dark"] .highlight .kc { color: #DCC6E0 } /* Keyword.Constant */ +html[data-theme="dark"] .highlight .kd { color: #DCC6E0 } /* Keyword.Declaration */ +html[data-theme="dark"] .highlight .kn { color: #DCC6E0 } /* Keyword.Namespace */ +html[data-theme="dark"] .highlight .kp { color: #DCC6E0 } /* Keyword.Pseudo */ +html[data-theme="dark"] .highlight .kr { color: #DCC6E0 } /* Keyword.Reserved */ +html[data-theme="dark"] .highlight .kt { color: #FFD900 } /* Keyword.Type */ +html[data-theme="dark"] .highlight .ld { color: #FFD900 } /* Literal.Date */ +html[data-theme="dark"] .highlight .m { color: #FFD900 } /* Literal.Number */ +html[data-theme="dark"] .highlight .s { color: #ABE338 } /* Literal.String */ +html[data-theme="dark"] .highlight .na { color: #FFD900 } /* Name.Attribute */ +html[data-theme="dark"] .highlight .nb { color: #FFD900 } /* Name.Builtin */ +html[data-theme="dark"] .highlight .nc { color: #00E0E0 } /* Name.Class */ +html[data-theme="dark"] .highlight .no { color: #00E0E0 } /* Name.Constant */ +html[data-theme="dark"] .highlight .nd { color: #FFD900 } /* Name.Decorator */ +html[data-theme="dark"] .highlight .ni { color: #ABE338 } /* Name.Entity */ +html[data-theme="dark"] .highlight .ne { color: #DCC6E0 } /* Name.Exception */ +html[data-theme="dark"] .highlight .nf { color: #00E0E0 } /* Name.Function */ +html[data-theme="dark"] .highlight .nl { color: #FFD900 } /* Name.Label */ +html[data-theme="dark"] .highlight .nn { color: #F8F8F2 } /* Name.Namespace */ +html[data-theme="dark"] .highlight .nx { color: #F8F8F2 } /* Name.Other */ +html[data-theme="dark"] .highlight .py { color: #00E0E0 } /* Name.Property */ +html[data-theme="dark"] .highlight .nt { color: #00E0E0 } /* Name.Tag */ +html[data-theme="dark"] .highlight .nv { color: #FFA07A } /* Name.Variable */ +html[data-theme="dark"] .highlight .ow { color: #DCC6E0 } /* Operator.Word */ +html[data-theme="dark"] .highlight .pm { color: #F8F8F2 } /* Punctuation.Marker */ +html[data-theme="dark"] .highlight .w { color: #F8F8F2 } /* Text.Whitespace */ +html[data-theme="dark"] .highlight .mb { color: #FFD900 } /* Literal.Number.Bin */ +html[data-theme="dark"] .highlight .mf { color: #FFD900 } /* Literal.Number.Float */ +html[data-theme="dark"] .highlight .mh { color: #FFD900 } /* Literal.Number.Hex */ +html[data-theme="dark"] .highlight .mi { color: #FFD900 } /* Literal.Number.Integer */ +html[data-theme="dark"] .highlight .mo { color: #FFD900 } /* Literal.Number.Oct */ +html[data-theme="dark"] .highlight .sa { color: #ABE338 } /* Literal.String.Affix */ +html[data-theme="dark"] .highlight .sb { color: #ABE338 } /* Literal.String.Backtick */ +html[data-theme="dark"] .highlight .sc { color: #ABE338 } /* Literal.String.Char */ +html[data-theme="dark"] .highlight .dl { color: #ABE338 } /* Literal.String.Delimiter */ +html[data-theme="dark"] .highlight .sd { color: #ABE338 } /* Literal.String.Doc */ +html[data-theme="dark"] .highlight .s2 { color: #ABE338 } /* Literal.String.Double */ +html[data-theme="dark"] .highlight .se { color: #ABE338 } /* Literal.String.Escape */ +html[data-theme="dark"] .highlight .sh { color: #ABE338 } /* Literal.String.Heredoc */ +html[data-theme="dark"] .highlight .si { color: #ABE338 } /* Literal.String.Interpol */ +html[data-theme="dark"] .highlight .sx { color: #ABE338 } /* Literal.String.Other */ +html[data-theme="dark"] .highlight .sr { color: #FFA07A } /* Literal.String.Regex */ +html[data-theme="dark"] .highlight .s1 { color: #ABE338 } /* Literal.String.Single */ +html[data-theme="dark"] .highlight .ss { color: #00E0E0 } /* Literal.String.Symbol */ +html[data-theme="dark"] .highlight .bp { color: #FFD900 } /* Name.Builtin.Pseudo */ +html[data-theme="dark"] .highlight .fm { color: #00E0E0 } /* Name.Function.Magic */ +html[data-theme="dark"] .highlight .vc { color: #FFA07A } /* Name.Variable.Class */ +html[data-theme="dark"] .highlight .vg { color: #FFA07A } /* Name.Variable.Global */ +html[data-theme="dark"] .highlight .vi { color: #FFA07A } /* Name.Variable.Instance */ +html[data-theme="dark"] .highlight .vm { color: #FFD900 } /* Name.Variable.Magic */ +html[data-theme="dark"] .highlight .il { color: #FFD900 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/zh-cn/latest/html/_static/sbt-webpack-macros.html b/docs/zh-cn/latest/html/_static/sbt-webpack-macros.html new file mode 100644 index 0000000000000000000000000000000000000000..6cbf559faac53f44f0c1f75ed908cde94c0ee712 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/sbt-webpack-macros.html @@ -0,0 +1,11 @@ + +{% macro head_pre_bootstrap() %} + +{% endmacro %} + +{% macro body_post() %} + +{% endmacro %} diff --git a/docs/zh-cn/latest/html/_static/scripts/bootstrap.js b/docs/zh-cn/latest/html/_static/scripts/bootstrap.js new file mode 100644 index 0000000000000000000000000000000000000000..c8178debbcd93ce91e02f7a6f001c2c203dadfab --- /dev/null +++ b/docs/zh-cn/latest/html/_static/scripts/bootstrap.js @@ -0,0 +1,3 @@ +/*! For license information please see bootstrap.js.LICENSE.txt */ +(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{afterMain:()=>E,afterRead:()=>v,afterWrite:()=>C,applyStyles:()=>$,arrow:()=>J,auto:()=>a,basePlacements:()=>l,beforeMain:()=>y,beforeRead:()=>_,beforeWrite:()=>A,bottom:()=>s,clippingParents:()=>d,computeStyles:()=>it,createPopper:()=>Dt,createPopperBase:()=>St,createPopperLite:()=>$t,detectOverflow:()=>_t,end:()=>h,eventListeners:()=>st,flip:()=>bt,hide:()=>wt,left:()=>r,main:()=>w,modifierPhases:()=>O,offset:()=>Et,placements:()=>g,popper:()=>f,popperGenerator:()=>Lt,popperOffsets:()=>At,preventOverflow:()=>Tt,read:()=>b,reference:()=>p,right:()=>o,start:()=>c,top:()=>n,variationPlacements:()=>m,viewport:()=>u,write:()=>T});var i={};t.r(i),t.d(i,{Alert:()=>Oe,Button:()=>ke,Carousel:()=>li,Collapse:()=>Ei,Dropdown:()=>Ki,Modal:()=>Ln,Offcanvas:()=>Kn,Popover:()=>bs,ScrollSpy:()=>Ls,Tab:()=>Js,Toast:()=>po,Tooltip:()=>fs});var n="top",s="bottom",o="right",r="left",a="auto",l=[n,s,o,r],c="start",h="end",d="clippingParents",u="viewport",f="popper",p="reference",m=l.reduce((function(t,e){return t.concat([e+"-"+c,e+"-"+h])}),[]),g=[].concat(l,[a]).reduce((function(t,e){return t.concat([e,e+"-"+c,e+"-"+h])}),[]),_="beforeRead",b="read",v="afterRead",y="beforeMain",w="main",E="afterMain",A="beforeWrite",T="write",C="afterWrite",O=[_,b,v,y,w,E,A,T,C];function x(t){return t?(t.nodeName||"").toLowerCase():null}function k(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function L(t){return t instanceof k(t).Element||t instanceof Element}function S(t){return t instanceof k(t).HTMLElement||t instanceof HTMLElement}function D(t){return"undefined"!=typeof ShadowRoot&&(t instanceof k(t).ShadowRoot||t instanceof ShadowRoot)}const $={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];S(s)&&x(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});S(n)&&x(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function I(t){return t.split("-")[0]}var N=Math.max,P=Math.min,M=Math.round;function j(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function F(){return!/^((?!chrome|android).)*safari/i.test(j())}function H(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&S(t)&&(s=t.offsetWidth>0&&M(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&M(n.height)/t.offsetHeight||1);var r=(L(t)?k(t):window).visualViewport,a=!F()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function B(t){var e=H(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function W(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&D(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function z(t){return k(t).getComputedStyle(t)}function R(t){return["table","td","th"].indexOf(x(t))>=0}function q(t){return((L(t)?t.ownerDocument:t.document)||window.document).documentElement}function V(t){return"html"===x(t)?t:t.assignedSlot||t.parentNode||(D(t)?t.host:null)||q(t)}function Y(t){return S(t)&&"fixed"!==z(t).position?t.offsetParent:null}function K(t){for(var e=k(t),i=Y(t);i&&R(i)&&"static"===z(i).position;)i=Y(i);return i&&("html"===x(i)||"body"===x(i)&&"static"===z(i).position)?e:i||function(t){var e=/firefox/i.test(j());if(/Trident/i.test(j())&&S(t)&&"fixed"===z(t).position)return null;var i=V(t);for(D(i)&&(i=i.host);S(i)&&["html","body"].indexOf(x(i))<0;){var n=z(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Q(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function X(t,e,i){return N(t,P(e,i))}function U(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function G(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const J={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,a=t.name,c=t.options,h=i.elements.arrow,d=i.modifiersData.popperOffsets,u=I(i.placement),f=Q(u),p=[r,o].indexOf(u)>=0?"height":"width";if(h&&d){var m=function(t,e){return U("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:G(t,l))}(c.padding,i),g=B(h),_="y"===f?n:r,b="y"===f?s:o,v=i.rects.reference[p]+i.rects.reference[f]-d[f]-i.rects.popper[p],y=d[f]-i.rects.reference[f],w=K(h),E=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,A=v/2-y/2,T=m[_],C=E-g[p]-m[b],O=E/2-g[p]/2+A,x=X(T,O,C),k=f;i.modifiersData[a]=((e={})[k]=x,e.centerOffset=x-O,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&W(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Z(t){return t.split("-")[1]}var tt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function et(t){var e,i=t.popper,a=t.popperRect,l=t.placement,c=t.variation,d=t.offsets,u=t.position,f=t.gpuAcceleration,p=t.adaptive,m=t.roundOffsets,g=t.isFixed,_=d.x,b=void 0===_?0:_,v=d.y,y=void 0===v?0:v,w="function"==typeof m?m({x:b,y}):{x:b,y};b=w.x,y=w.y;var E=d.hasOwnProperty("x"),A=d.hasOwnProperty("y"),T=r,C=n,O=window;if(p){var x=K(i),L="clientHeight",S="clientWidth";x===k(i)&&"static"!==z(x=q(i)).position&&"absolute"===u&&(L="scrollHeight",S="scrollWidth"),(l===n||(l===r||l===o)&&c===h)&&(C=s,y-=(g&&x===O&&O.visualViewport?O.visualViewport.height:x[L])-a.height,y*=f?1:-1),l!==r&&(l!==n&&l!==s||c!==h)||(T=o,b-=(g&&x===O&&O.visualViewport?O.visualViewport.width:x[S])-a.width,b*=f?1:-1)}var D,$=Object.assign({position:u},p&&tt),I=!0===m?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:M(i*s)/s||0,y:M(n*s)/s||0}}({x:b,y},k(i)):{x:b,y};return b=I.x,y=I.y,f?Object.assign({},$,((D={})[C]=A?"0":"",D[T]=E?"0":"",D.transform=(O.devicePixelRatio||1)<=1?"translate("+b+"px, "+y+"px)":"translate3d("+b+"px, "+y+"px, 0)",D)):Object.assign({},$,((e={})[C]=A?y+"px":"",e[T]=E?b+"px":"",e.transform="",e))}const it={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:I(e.placement),variation:Z(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,et(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,et(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var nt={passive:!0};const st={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=k(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,nt)})),a&&l.addEventListener("resize",i.update,nt),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,nt)})),a&&l.removeEventListener("resize",i.update,nt)}},data:{}};var ot={left:"right",right:"left",bottom:"top",top:"bottom"};function rt(t){return t.replace(/left|right|bottom|top/g,(function(t){return ot[t]}))}var at={start:"end",end:"start"};function lt(t){return t.replace(/start|end/g,(function(t){return at[t]}))}function ct(t){var e=k(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ht(t){return H(q(t)).left+ct(t).scrollLeft}function dt(t){var e=z(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function ut(t){return["html","body","#document"].indexOf(x(t))>=0?t.ownerDocument.body:S(t)&&dt(t)?t:ut(V(t))}function ft(t,e){var i;void 0===e&&(e=[]);var n=ut(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=k(n),r=s?[o].concat(o.visualViewport||[],dt(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(ft(V(r)))}function pt(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function mt(t,e,i){return e===u?pt(function(t,e){var i=k(t),n=q(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=F();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ht(t),y:l}}(t,i)):L(e)?function(t,e){var i=H(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):pt(function(t){var e,i=q(t),n=ct(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=N(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=N(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ht(t),l=-n.scrollTop;return"rtl"===z(s||i).direction&&(a+=N(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(q(t)))}function gt(t){var e,i=t.reference,a=t.element,l=t.placement,d=l?I(l):null,u=l?Z(l):null,f=i.x+i.width/2-a.width/2,p=i.y+i.height/2-a.height/2;switch(d){case n:e={x:f,y:i.y-a.height};break;case s:e={x:f,y:i.y+i.height};break;case o:e={x:i.x+i.width,y:p};break;case r:e={x:i.x-a.width,y:p};break;default:e={x:i.x,y:i.y}}var m=d?Q(d):null;if(null!=m){var g="y"===m?"height":"width";switch(u){case c:e[m]=e[m]-(i[g]/2-a[g]/2);break;case h:e[m]=e[m]+(i[g]/2-a[g]/2)}}return e}function _t(t,e){void 0===e&&(e={});var i=e,r=i.placement,a=void 0===r?t.placement:r,c=i.strategy,h=void 0===c?t.strategy:c,m=i.boundary,g=void 0===m?d:m,_=i.rootBoundary,b=void 0===_?u:_,v=i.elementContext,y=void 0===v?f:v,w=i.altBoundary,E=void 0!==w&&w,A=i.padding,T=void 0===A?0:A,C=U("number"!=typeof T?T:G(T,l)),O=y===f?p:f,k=t.rects.popper,D=t.elements[E?O:y],$=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=ft(V(t)),i=["absolute","fixed"].indexOf(z(t).position)>=0&&S(t)?K(t):t;return L(i)?e.filter((function(t){return L(t)&&W(t,i)&&"body"!==x(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=mt(t,i,n);return e.top=N(s.top,e.top),e.right=P(s.right,e.right),e.bottom=P(s.bottom,e.bottom),e.left=N(s.left,e.left),e}),mt(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(L(D)?D:D.contextElement||q(t.elements.popper),g,b,h),I=H(t.elements.reference),M=gt({reference:I,element:k,strategy:"absolute",placement:a}),j=pt(Object.assign({},k,M)),F=y===f?j:I,B={top:$.top-F.top+C.top,bottom:F.bottom-$.bottom+C.bottom,left:$.left-F.left+C.left,right:F.right-$.right+C.right},R=t.modifiersData.offset;if(y===f&&R){var Y=R[a];Object.keys(B).forEach((function(t){var e=[o,s].indexOf(t)>=0?1:-1,i=[n,s].indexOf(t)>=0?"y":"x";B[t]+=Y[i]*e}))}return B}const bt={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var d=i.mainAxis,u=void 0===d||d,f=i.altAxis,p=void 0===f||f,_=i.fallbackPlacements,b=i.padding,v=i.boundary,y=i.rootBoundary,w=i.altBoundary,E=i.flipVariations,A=void 0===E||E,T=i.allowedAutoPlacements,C=e.options.placement,O=I(C),x=_||(O!==C&&A?function(t){if(I(t)===a)return[];var e=rt(t);return[lt(t),e,lt(e)]}(C):[rt(C)]),k=[C].concat(x).reduce((function(t,i){return t.concat(I(i)===a?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?g:c,d=Z(n),u=d?a?m:m.filter((function(t){return Z(t)===d})):l,f=u.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=u);var p=f.reduce((function(e,i){return e[i]=_t(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[I(i)],e}),{});return Object.keys(p).sort((function(t,e){return p[t]-p[e]}))}(e,{placement:i,boundary:v,rootBoundary:y,padding:b,flipVariations:A,allowedAutoPlacements:T}):i)}),[]),L=e.rects.reference,S=e.rects.popper,D=new Map,$=!0,N=k[0],P=0;P=0,B=H?"width":"height",W=_t(e,{placement:M,boundary:v,rootBoundary:y,altBoundary:w,padding:b}),z=H?F?o:r:F?s:n;L[B]>S[B]&&(z=rt(z));var R=rt(z),q=[];if(u&&q.push(W[j]<=0),p&&q.push(W[z]<=0,W[R]<=0),q.every((function(t){return t}))){N=M,$=!1;break}D.set(M,q)}if($)for(var V=function(t){var e=k.find((function(e){var i=D.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return N=e,"break"},Y=A?3:1;Y>0&&"break"!==V(Y);Y--);e.placement!==N&&(e.modifiersData[h]._skip=!0,e.placement=N,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function vt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function yt(t){return[n,o,s,r].some((function(e){return t[e]>=0}))}const wt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=_t(e,{elementContext:"reference"}),a=_t(e,{altBoundary:!0}),l=vt(r,n),c=vt(a,s,o),h=yt(l),d=yt(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Et={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,s=t.name,a=i.offset,l=void 0===a?[0,0]:a,c=g.reduce((function(t,i){return t[i]=function(t,e,i){var s=I(t),a=[r,n].indexOf(s)>=0?-1:1,l="function"==typeof i?i(Object.assign({},e,{placement:t})):i,c=l[0],h=l[1];return c=c||0,h=(h||0)*a,[r,o].indexOf(s)>=0?{x:h,y:c}:{x:c,y:h}}(i,e.rects,l),t}),{}),h=c[e.placement],d=h.x,u=h.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=d,e.modifiersData.popperOffsets.y+=u),e.modifiersData[s]=c}},At={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=gt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},Tt={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,a=t.name,l=i.mainAxis,h=void 0===l||l,d=i.altAxis,u=void 0!==d&&d,f=i.boundary,p=i.rootBoundary,m=i.altBoundary,g=i.padding,_=i.tether,b=void 0===_||_,v=i.tetherOffset,y=void 0===v?0:v,w=_t(e,{boundary:f,rootBoundary:p,padding:g,altBoundary:m}),E=I(e.placement),A=Z(e.placement),T=!A,C=Q(E),O="x"===C?"y":"x",x=e.modifiersData.popperOffsets,k=e.rects.reference,L=e.rects.popper,S="function"==typeof y?y(Object.assign({},e.rects,{placement:e.placement})):y,D="number"==typeof S?{mainAxis:S,altAxis:S}:Object.assign({mainAxis:0,altAxis:0},S),$=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,M={x:0,y:0};if(x){if(h){var j,F="y"===C?n:r,H="y"===C?s:o,W="y"===C?"height":"width",z=x[C],R=z+w[F],q=z-w[H],V=b?-L[W]/2:0,Y=A===c?k[W]:L[W],U=A===c?-L[W]:-k[W],G=e.elements.arrow,J=b&&G?B(G):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[F],it=tt[H],nt=X(0,k[W],J[W]),st=T?k[W]/2-V-nt-et-D.mainAxis:Y-nt-et-D.mainAxis,ot=T?-k[W]/2+V+nt+it+D.mainAxis:U+nt+it+D.mainAxis,rt=e.elements.arrow&&K(e.elements.arrow),at=rt?"y"===C?rt.clientTop||0:rt.clientLeft||0:0,lt=null!=(j=null==$?void 0:$[C])?j:0,ct=z+ot-lt,ht=X(b?P(R,z+st-lt-at):R,z,b?N(q,ct):q);x[C]=ht,M[C]=ht-z}if(u){var dt,ut="x"===C?n:r,ft="x"===C?s:o,pt=x[O],mt="y"===O?"height":"width",gt=pt+w[ut],bt=pt-w[ft],vt=-1!==[n,r].indexOf(E),yt=null!=(dt=null==$?void 0:$[O])?dt:0,wt=vt?gt:pt-k[mt]-L[mt]-yt+D.altAxis,Et=vt?pt+k[mt]+L[mt]-yt-D.altAxis:bt,At=b&&vt?function(t,e,i){var n=X(t,e,i);return n>i?i:n}(wt,pt,Et):X(b?wt:gt,pt,b?Et:bt);x[O]=At,M[O]=At-pt}e.modifiersData[a]=M}},requiresIfExists:["offset"]};function Ct(t,e,i){void 0===i&&(i=!1);var n,s,o=S(e),r=S(e)&&function(t){var e=t.getBoundingClientRect(),i=M(e.width)/t.offsetWidth||1,n=M(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=q(e),l=H(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==x(e)||dt(a))&&(c=(n=e)!==k(n)&&S(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:ct(n)),S(e)?((h=H(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ht(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function Ot(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var xt={placement:"bottom",modifiers:[],strategy:"absolute"};function kt(){for(var t=arguments.length,e=new Array(t),i=0;iIt.has(t)&&It.get(t).get(e)||null,remove(t,e){if(!It.has(t))return;const i=It.get(t);i.delete(e),0===i.size&&It.delete(t)}},Pt="transitionend",Mt=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),jt=t=>{t.dispatchEvent(new Event(Pt))},Ft=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),Ht=t=>Ft(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(Mt(t)):null,Bt=t=>{if(!Ft(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},Wt=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),zt=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?zt(t.parentNode):null},Rt=()=>{},qt=t=>{t.offsetHeight},Vt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Yt=[],Kt=()=>"rtl"===document.documentElement.dir,Qt=t=>{var e;e=()=>{const e=Vt();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(Yt.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of Yt)t()})),Yt.push(e)):e()},Xt=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,Ut=(t,e,i=!0)=>{if(!i)return void Xt(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let s=!1;const o=({target:i})=>{i===e&&(s=!0,e.removeEventListener(Pt,o),Xt(t))};e.addEventListener(Pt,o),setTimeout((()=>{s||jt(e)}),n)},Gt=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},Jt=/[^.]*(?=\..*)\.|.*/,Zt=/\..*/,te=/::\d+$/,ee={};let ie=1;const ne={mouseenter:"mouseover",mouseleave:"mouseout"},se=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function oe(t,e){return e&&`${e}::${ie++}`||t.uidEvent||ie++}function re(t){const e=oe(t);return t.uidEvent=e,ee[e]=ee[e]||{},ee[e]}function ae(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function le(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=ue(t);return se.has(o)||(o=t),[n,s,o]}function ce(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=le(e,i,n);if(e in ne){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=re(t),c=l[a]||(l[a]={}),h=ae(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=oe(r,e.replace(Jt,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return pe(s,{delegateTarget:r}),n.oneOff&&fe.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return pe(n,{delegateTarget:t}),i.oneOff&&fe.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function he(t,e,i,n,s){const o=ae(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function de(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&he(t,e,i,r.callable,r.delegationSelector)}function ue(t){return t=t.replace(Zt,""),ne[t]||t}const fe={on(t,e,i,n){ce(t,e,i,n,!1)},one(t,e,i,n){ce(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=le(e,i,n),a=r!==e,l=re(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))de(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(te,"");a&&!e.includes(s)||he(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;he(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=Vt();let s=null,o=!0,r=!0,a=!1;e!==ue(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=pe(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function pe(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function me(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function ge(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const _e={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${ge(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${ge(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=me(t.dataset[n])}return e},getDataAttribute:(t,e)=>me(t.getAttribute(`data-bs-${ge(e)}`))};class be{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=Ft(e)?_e.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...Ft(e)?_e.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],o=Ft(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${o}" but expected type "${s}".`)}var i}}class ve extends be{constructor(t,e){super(),(t=Ht(t))&&(this._element=t,this._config=this._getConfig(e),Nt.set(this._element,this.constructor.DATA_KEY,this))}dispose(){Nt.remove(this._element,this.constructor.DATA_KEY),fe.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){Ut(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return Nt.get(Ht(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const ye=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map((t=>Mt(t))).join(","):null},we={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!Wt(t)&&Bt(t)))},getSelectorFromElement(t){const e=ye(t);return e&&we.findOne(e)?e:null},getElementFromSelector(t){const e=ye(t);return e?we.findOne(e):null},getMultipleElementsFromSelector(t){const e=ye(t);return e?we.find(e):[]}},Ee=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;fe.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),Wt(this))return;const s=we.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},Ae=".bs.alert",Te=`close${Ae}`,Ce=`closed${Ae}`;class Oe extends ve{static get NAME(){return"alert"}close(){if(fe.trigger(this._element,Te).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),fe.trigger(this._element,Ce),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Oe.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}Ee(Oe,"close"),Qt(Oe);const xe='[data-bs-toggle="button"]';class ke extends ve{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=ke.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}fe.on(document,"click.bs.button.data-api",xe,(t=>{t.preventDefault();const e=t.target.closest(xe);ke.getOrCreateInstance(e).toggle()})),Qt(ke);const Le=".bs.swipe",Se=`touchstart${Le}`,De=`touchmove${Le}`,$e=`touchend${Le}`,Ie=`pointerdown${Le}`,Ne=`pointerup${Le}`,Pe={endCallback:null,leftCallback:null,rightCallback:null},Me={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class je extends be{constructor(t,e){super(),this._element=t,t&&je.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Pe}static get DefaultType(){return Me}static get NAME(){return"swipe"}dispose(){fe.off(this._element,Le)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),Xt(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&Xt(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(fe.on(this._element,Ie,(t=>this._start(t))),fe.on(this._element,Ne,(t=>this._end(t))),this._element.classList.add("pointer-event")):(fe.on(this._element,Se,(t=>this._start(t))),fe.on(this._element,De,(t=>this._move(t))),fe.on(this._element,$e,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const Fe=".bs.carousel",He=".data-api",Be="ArrowLeft",We="ArrowRight",ze="next",Re="prev",qe="left",Ve="right",Ye=`slide${Fe}`,Ke=`slid${Fe}`,Qe=`keydown${Fe}`,Xe=`mouseenter${Fe}`,Ue=`mouseleave${Fe}`,Ge=`dragstart${Fe}`,Je=`load${Fe}${He}`,Ze=`click${Fe}${He}`,ti="carousel",ei="active",ii=".active",ni=".carousel-item",si=ii+ni,oi={[Be]:Ve,[We]:qe},ri={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},ai={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class li extends ve{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=we.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===ti&&this.cycle()}static get Default(){return ri}static get DefaultType(){return ai}static get NAME(){return"carousel"}next(){this._slide(ze)}nextWhenVisible(){!document.hidden&&Bt(this._element)&&this.next()}prev(){this._slide(Re)}pause(){this._isSliding&&jt(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?fe.one(this._element,Ke,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void fe.one(this._element,Ke,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?ze:Re;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&fe.on(this._element,Qe,(t=>this._keydown(t))),"hover"===this._config.pause&&(fe.on(this._element,Xe,(()=>this.pause())),fe.on(this._element,Ue,(()=>this._maybeEnableCycle()))),this._config.touch&&je.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of we.find(".carousel-item img",this._element))fe.on(t,Ge,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(qe)),rightCallback:()=>this._slide(this._directionToOrder(Ve)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new je(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=oi[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=we.findOne(ii,this._indicatorsElement);e.classList.remove(ei),e.removeAttribute("aria-current");const i=we.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(ei),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===ze,s=e||Gt(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>fe.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(Ye).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),qt(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(ei),i.classList.remove(ei,c,l),this._isSliding=!1,r(Ke)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return we.findOne(si,this._element)}_getItems(){return we.find(ni,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return Kt()?t===qe?Re:ze:t===qe?ze:Re}_orderToDirection(t){return Kt()?t===Re?qe:Ve:t===Re?Ve:qe}static jQueryInterface(t){return this.each((function(){const e=li.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}fe.on(document,Ze,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=we.getElementFromSelector(this);if(!e||!e.classList.contains(ti))return;t.preventDefault();const i=li.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===_e.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),fe.on(window,Je,(()=>{const t=we.find('[data-bs-ride="carousel"]');for(const e of t)li.getOrCreateInstance(e)})),Qt(li);const ci=".bs.collapse",hi=`show${ci}`,di=`shown${ci}`,ui=`hide${ci}`,fi=`hidden${ci}`,pi=`click${ci}.data-api`,mi="show",gi="collapse",_i="collapsing",bi=`:scope .${gi} .${gi}`,vi='[data-bs-toggle="collapse"]',yi={parent:null,toggle:!0},wi={parent:"(null|element)",toggle:"boolean"};class Ei extends ve{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=we.find(vi);for(const t of i){const e=we.getSelectorFromElement(t),i=we.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return yi}static get DefaultType(){return wi}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Ei.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(fe.trigger(this._element,hi).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(gi),this._element.classList.add(_i),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(_i),this._element.classList.add(gi,mi),this._element.style[e]="",fe.trigger(this._element,di)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(fe.trigger(this._element,ui).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,qt(this._element),this._element.classList.add(_i),this._element.classList.remove(gi,mi);for(const t of this._triggerArray){const e=we.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(_i),this._element.classList.add(gi),fe.trigger(this._element,fi)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(mi)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=Ht(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(vi);for(const e of t){const t=we.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=we.find(bi,this._config.parent);return we.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Ei.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}fe.on(document,pi,vi,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of we.getMultipleElementsFromSelector(this))Ei.getOrCreateInstance(t,{toggle:!1}).toggle()})),Qt(Ei);const Ai="dropdown",Ti=".bs.dropdown",Ci=".data-api",Oi="ArrowUp",xi="ArrowDown",ki=`hide${Ti}`,Li=`hidden${Ti}`,Si=`show${Ti}`,Di=`shown${Ti}`,$i=`click${Ti}${Ci}`,Ii=`keydown${Ti}${Ci}`,Ni=`keyup${Ti}${Ci}`,Pi="show",Mi='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',ji=`${Mi}.${Pi}`,Fi=".dropdown-menu",Hi=Kt()?"top-end":"top-start",Bi=Kt()?"top-start":"top-end",Wi=Kt()?"bottom-end":"bottom-start",zi=Kt()?"bottom-start":"bottom-end",Ri=Kt()?"left-start":"right-start",qi=Kt()?"right-start":"left-start",Vi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Yi={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class Ki extends ve{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=we.next(this._element,Fi)[0]||we.prev(this._element,Fi)[0]||we.findOne(Fi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Vi}static get DefaultType(){return Yi}static get NAME(){return Ai}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Wt(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!fe.trigger(this._element,Si,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Pi),this._element.classList.add(Pi),fe.trigger(this._element,Di,t)}}hide(){if(Wt(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!fe.trigger(this._element,ki,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._popper&&this._popper.destroy(),this._menu.classList.remove(Pi),this._element.classList.remove(Pi),this._element.setAttribute("aria-expanded","false"),_e.removeDataAttribute(this._menu,"popper"),fe.trigger(this._element,Li,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!Ft(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ai.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===e)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:Ft(this._config.reference)?t=Ht(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const i=this._getPopperConfig();this._popper=Dt(t,this._menu,i)}_isShown(){return this._menu.classList.contains(Pi)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Ri;if(t.classList.contains("dropstart"))return qi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?Bi:Hi:e?zi:Wi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(_e.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...Xt(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=we.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>Bt(t)));i.length&&Gt(i,e,t===xi,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=Ki.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=we.find(ji);for(const i of e){const e=Ki.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Oi,xi].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Mi)?this:we.prev(this,Mi)[0]||we.next(this,Mi)[0]||we.findOne(Mi,t.delegateTarget.parentNode),o=Ki.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}fe.on(document,Ii,Mi,Ki.dataApiKeydownHandler),fe.on(document,Ii,Fi,Ki.dataApiKeydownHandler),fe.on(document,$i,Ki.clearMenus),fe.on(document,Ni,Ki.clearMenus),fe.on(document,$i,Mi,(function(t){t.preventDefault(),Ki.getOrCreateInstance(this).toggle()})),Qt(Ki);const Qi="backdrop",Xi="show",Ui=`mousedown.bs.${Qi}`,Gi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ji={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Zi extends be{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Gi}static get DefaultType(){return Ji}static get NAME(){return Qi}show(t){if(!this._config.isVisible)return void Xt(t);this._append();const e=this._getElement();this._config.isAnimated&&qt(e),e.classList.add(Xi),this._emulateAnimation((()=>{Xt(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Xi),this._emulateAnimation((()=>{this.dispose(),Xt(t)}))):Xt(t)}dispose(){this._isAppended&&(fe.off(this._element,Ui),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=Ht(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),fe.on(t,Ui,(()=>{Xt(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){Ut(t,this._getElement(),this._config.isAnimated)}}const tn=".bs.focustrap",en=`focusin${tn}`,nn=`keydown.tab${tn}`,sn="backward",on={autofocus:!0,trapElement:null},rn={autofocus:"boolean",trapElement:"element"};class an extends be{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return on}static get DefaultType(){return rn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),fe.off(document,tn),fe.on(document,en,(t=>this._handleFocusin(t))),fe.on(document,nn,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,fe.off(document,tn))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=we.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===sn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?sn:"forward")}}const ln=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",cn=".sticky-top",hn="padding-right",dn="margin-right";class un{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,hn,(e=>e+t)),this._setElementAttributes(ln,hn,(e=>e+t)),this._setElementAttributes(cn,dn,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,hn),this._resetElementAttributes(ln,hn),this._resetElementAttributes(cn,dn)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&_e.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=_e.getDataAttribute(t,e);null!==i?(_e.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(Ft(t))e(t);else for(const i of we.find(t,this._element))e(i)}}const fn=".bs.modal",pn=`hide${fn}`,mn=`hidePrevented${fn}`,gn=`hidden${fn}`,_n=`show${fn}`,bn=`shown${fn}`,vn=`resize${fn}`,yn=`click.dismiss${fn}`,wn=`mousedown.dismiss${fn}`,En=`keydown.dismiss${fn}`,An=`click${fn}.data-api`,Tn="modal-open",Cn="show",On="modal-static",xn={backdrop:!0,focus:!0,keyboard:!0},kn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ln extends ve{constructor(t,e){super(t,e),this._dialog=we.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new un,this._addEventListeners()}static get Default(){return xn}static get DefaultType(){return kn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||fe.trigger(this._element,_n,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Tn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(fe.trigger(this._element,pn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Cn),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){fe.off(window,fn),fe.off(this._dialog,fn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Zi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new an({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=we.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),qt(this._element),this._element.classList.add(Cn),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,fe.trigger(this._element,bn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){fe.on(this._element,En,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),fe.on(window,vn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),fe.on(this._element,wn,(t=>{fe.one(this._element,yn,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(Tn),this._resetAdjustments(),this._scrollBar.reset(),fe.trigger(this._element,gn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(fe.trigger(this._element,mn).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(On)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(On),this._queueCallback((()=>{this._element.classList.remove(On),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=Kt()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=Kt()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ln.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}fe.on(document,An,'[data-bs-toggle="modal"]',(function(t){const e=we.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),fe.one(e,_n,(t=>{t.defaultPrevented||fe.one(e,gn,(()=>{Bt(this)&&this.focus()}))}));const i=we.findOne(".modal.show");i&&Ln.getInstance(i).hide(),Ln.getOrCreateInstance(e).toggle(this)})),Ee(Ln),Qt(Ln);const Sn=".bs.offcanvas",Dn=".data-api",$n=`load${Sn}${Dn}`,In="show",Nn="showing",Pn="hiding",Mn=".offcanvas.show",jn=`show${Sn}`,Fn=`shown${Sn}`,Hn=`hide${Sn}`,Bn=`hidePrevented${Sn}`,Wn=`hidden${Sn}`,zn=`resize${Sn}`,Rn=`click${Sn}${Dn}`,qn=`keydown.dismiss${Sn}`,Vn={backdrop:!0,keyboard:!0,scroll:!1},Yn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Kn extends ve{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Vn}static get DefaultType(){return Yn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||fe.trigger(this._element,jn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new un).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Nn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(In),this._element.classList.remove(Nn),fe.trigger(this._element,Fn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(fe.trigger(this._element,Hn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Pn),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(In,Pn),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new un).reset(),fe.trigger(this._element,Wn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Zi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():fe.trigger(this._element,Bn)}:null})}_initializeFocusTrap(){return new an({trapElement:this._element})}_addEventListeners(){fe.on(this._element,qn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():fe.trigger(this._element,Bn))}))}static jQueryInterface(t){return this.each((function(){const e=Kn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}fe.on(document,Rn,'[data-bs-toggle="offcanvas"]',(function(t){const e=we.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this))return;fe.one(e,Wn,(()=>{Bt(this)&&this.focus()}));const i=we.findOne(Mn);i&&i!==e&&Kn.getInstance(i).hide(),Kn.getOrCreateInstance(e).toggle(this)})),fe.on(window,$n,(()=>{for(const t of we.find(Mn))Kn.getOrCreateInstance(t).show()})),fe.on(window,zn,(()=>{for(const t of we.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Kn.getOrCreateInstance(t).hide()})),Ee(Kn),Qt(Kn);const Qn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Xn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Un=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Gn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Xn.has(i)||Boolean(Un.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Jn={allowList:Qn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
    "},Zn={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},ts={entry:"(string|element|function|null)",selector:"(string|element)"};class es extends be{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Jn}static get DefaultType(){return Zn}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},ts)}_setContent(t,e,i){const n=we.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?Ft(e)?this._putElementInTemplate(Ht(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Gn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return Xt(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const is=new Set(["sanitize","allowList","sanitizeFn"]),ns="fade",ss="show",os=".tooltip-inner",rs=".modal",as="hide.bs.modal",ls="hover",cs="focus",hs={AUTO:"auto",TOP:"top",RIGHT:Kt()?"left":"right",BOTTOM:"bottom",LEFT:Kt()?"right":"left"},ds={allowList:Qn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},us={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class fs extends ve{constructor(t,i){if(void 0===e)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,i),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return ds}static get DefaultType(){return us}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),fe.off(this._element.closest(rs),as,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=fe.trigger(this._element,this.constructor.eventName("show")),e=(zt(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),fe.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._queueCallback((()=>{fe.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!fe.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._activeTrigger.click=!1,this._activeTrigger[cs]=!1,this._activeTrigger[ls]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),fe.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ns,ss),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ns),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new es({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[os]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ns)}_isShown(){return this.tip&&this.tip.classList.contains(ss)}_createPopper(t){const e=Xt(this._config.placement,[this,t,this._element]),i=hs[e.toUpperCase()];return Dt(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return Xt(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...Xt(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)fe.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ls?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ls?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");fe.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?cs:ls]=!0,e._enter()})),fe.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?cs:ls]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},fe.on(this._element.closest(rs),as,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=_e.getDataAttributes(this._element);for(const t of Object.keys(e))is.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:Ht(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=fs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(fs);const ps=".popover-header",ms=".popover-body",gs={...fs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},_s={...fs.DefaultType,content:"(null|string|element|function)"};class bs extends fs{static get Default(){return gs}static get DefaultType(){return _s}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[ps]:this._getTitle(),[ms]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=bs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(bs);const vs=".bs.scrollspy",ys=`activate${vs}`,ws=`click${vs}`,Es=`load${vs}.data-api`,As="active",Ts="[href]",Cs=".nav-link",Os=`${Cs}, .nav-item > ${Cs}, .list-group-item`,xs={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},ks={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Ls extends ve{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return xs}static get DefaultType(){return ks}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=Ht(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(fe.off(this._config.target,ws),fe.on(this._config.target,ws,Ts,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=we.find(Ts,this._config.target);for(const e of t){if(!e.hash||Wt(e))continue;const t=we.findOne(decodeURI(e.hash),this._element);Bt(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(As),this._activateParents(t),fe.trigger(this._element,ys,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))we.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(As);else for(const e of we.parents(t,".nav, .list-group"))for(const t of we.prev(e,Os))t.classList.add(As)}_clearActiveClass(t){t.classList.remove(As);const e=we.find(`${Ts}.${As}`,t);for(const t of e)t.classList.remove(As)}static jQueryInterface(t){return this.each((function(){const e=Ls.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(window,Es,(()=>{for(const t of we.find('[data-bs-spy="scroll"]'))Ls.getOrCreateInstance(t)})),Qt(Ls);const Ss=".bs.tab",Ds=`hide${Ss}`,$s=`hidden${Ss}`,Is=`show${Ss}`,Ns=`shown${Ss}`,Ps=`click${Ss}`,Ms=`keydown${Ss}`,js=`load${Ss}`,Fs="ArrowLeft",Hs="ArrowRight",Bs="ArrowUp",Ws="ArrowDown",zs="Home",Rs="End",qs="active",Vs="fade",Ys="show",Ks=".dropdown-toggle",Qs=`:not(${Ks})`,Xs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Us=`.nav-link${Qs}, .list-group-item${Qs}, [role="tab"]${Qs}, ${Xs}`,Gs=`.${qs}[data-bs-toggle="tab"], .${qs}[data-bs-toggle="pill"], .${qs}[data-bs-toggle="list"]`;class Js extends ve{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),fe.on(this._element,Ms,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?fe.trigger(e,Ds,{relatedTarget:t}):null;fe.trigger(t,Is,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(qs),this._activate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),fe.trigger(t,Ns,{relatedTarget:e})):t.classList.add(Ys)}),t,t.classList.contains(Vs)))}_deactivate(t,e){t&&(t.classList.remove(qs),t.blur(),this._deactivate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),fe.trigger(t,$s,{relatedTarget:e})):t.classList.remove(Ys)}),t,t.classList.contains(Vs)))}_keydown(t){if(![Fs,Hs,Bs,Ws,zs,Rs].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!Wt(t)));let i;if([zs,Rs].includes(t.key))i=e[t.key===zs?0:e.length-1];else{const n=[Hs,Ws].includes(t.key);i=Gt(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Js.getOrCreateInstance(i).show())}_getChildren(){return we.find(Us,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=we.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=we.findOne(t,i);s&&s.classList.toggle(n,e)};n(Ks,qs),n(".dropdown-menu",Ys),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(qs)}_getInnerElement(t){return t.matches(Us)?t:we.findOne(Us,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Js.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(document,Ps,Xs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this)||Js.getOrCreateInstance(this).show()})),fe.on(window,js,(()=>{for(const t of we.find(Gs))Js.getOrCreateInstance(t)})),Qt(Js);const Zs=".bs.toast",to=`mouseover${Zs}`,eo=`mouseout${Zs}`,io=`focusin${Zs}`,no=`focusout${Zs}`,so=`hide${Zs}`,oo=`hidden${Zs}`,ro=`show${Zs}`,ao=`shown${Zs}`,lo="hide",co="show",ho="showing",uo={animation:"boolean",autohide:"boolean",delay:"number"},fo={animation:!0,autohide:!0,delay:5e3};class po extends ve{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return fo}static get DefaultType(){return uo}static get NAME(){return"toast"}show(){fe.trigger(this._element,ro).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(lo),qt(this._element),this._element.classList.add(co,ho),this._queueCallback((()=>{this._element.classList.remove(ho),fe.trigger(this._element,ao),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(fe.trigger(this._element,so).defaultPrevented||(this._element.classList.add(ho),this._queueCallback((()=>{this._element.classList.add(lo),this._element.classList.remove(ho,co),fe.trigger(this._element,oo)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(co),super.dispose()}isShown(){return this._element.classList.contains(co)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){fe.on(this._element,to,(t=>this._onInteraction(t,!0))),fe.on(this._element,eo,(t=>this._onInteraction(t,!1))),fe.on(this._element,io,(t=>this._onInteraction(t,!0))),fe.on(this._element,no,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=po.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}function mo(t){"loading"!=document.readyState?t():document.addEventListener("DOMContentLoaded",t)}Ee(po),Qt(po),mo((function(){[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new fs(t,{delay:{show:500,hide:100}})}))})),mo((function(){document.getElementById("pst-back-to-top").addEventListener("click",(function(){document.body.scrollTop=0,document.documentElement.scrollTop=0}))})),mo((function(){var t=document.getElementById("pst-back-to-top"),e=document.getElementsByClassName("bd-header")[0].getBoundingClientRect();window.addEventListener("scroll",(function(){this.oldScroll>this.scrollY&&this.scrollY>e.bottom?t.style.display="block":t.style.display="none",this.oldScroll=this.scrollY}))})),window.bootstrap=i})(); +//# sourceMappingURL=bootstrap.js.map \ No newline at end of file diff --git a/docs/zh-cn/latest/html/_static/scripts/bootstrap.js.LICENSE.txt b/docs/zh-cn/latest/html/_static/scripts/bootstrap.js.LICENSE.txt new file mode 100644 index 0000000000000000000000000000000000000000..28755c2c5bb51a068eb89231909e5df345fed382 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/scripts/bootstrap.js.LICENSE.txt @@ -0,0 +1,5 @@ +/*! + * Bootstrap v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ diff --git a/docs/zh-cn/latest/html/_static/scripts/bootstrap.js.map b/docs/zh-cn/latest/html/_static/scripts/bootstrap.js.map new file mode 100644 index 0000000000000000000000000000000000000000..e9e815891f70903e723cfd0205f6edd6395773e3 --- /dev/null +++ b/docs/zh-cn/latest/html/_static/scripts/bootstrap.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/bootstrap.js","mappings":"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","sources":["webpack://pydata_sphinx_theme/webpack/bootstrap","webpack://pydata_sphinx_theme/webpack/runtime/define property getters","webpack://pydata_sphinx_theme/webpack/runtime/hasOwnProperty shorthand","webpack://pydata_sphinx_theme/webpack/runtime/make namespace object","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/enums.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/math.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/within.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/createPopper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://pydata_sphinx_theme/./node_modules/bootstrap/dist/js/bootstrap.esm.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/mixin.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/bootstrap.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","/*!\n * Bootstrap v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map();\nconst Data = {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map());\n }\n const instanceMap = elementMap.get(element);\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n return;\n }\n instanceMap.set(key, instance);\n },\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null;\n }\n return null;\n },\n remove(element, key) {\n if (!elementMap.has(element)) {\n return;\n }\n const instanceMap = elementMap.get(element);\n instanceMap.delete(key);\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element);\n }\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend';\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n }\n return selector;\n};\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`;\n }\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID);\n } while (document.getElementById(prefix));\n return prefix;\n};\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0;\n }\n\n // Get transition-duration of the element\n let {\n transitionDuration,\n transitionDelay\n } = window.getComputedStyle(element);\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\n const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END));\n};\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false;\n }\n if (typeof object.jquery !== 'undefined') {\n object = object[0];\n }\n return typeof object.nodeType !== 'undefined';\n};\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object;\n }\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object));\n }\n return null;\n};\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false;\n }\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])');\n if (!closedDetails) {\n return elementIsVisible;\n }\n if (closedDetails !== element) {\n const summary = element.closest('summary');\n if (summary && summary.parentNode !== closedDetails) {\n return false;\n }\n if (summary === null) {\n return false;\n }\n }\n return elementIsVisible;\n};\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true;\n }\n if (element.classList.contains('disabled')) {\n return true;\n }\n if (typeof element.disabled !== 'undefined') {\n return element.disabled;\n }\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null;\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n if (element instanceof ShadowRoot) {\n return element;\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null;\n }\n return findShadowRoot(element.parentNode);\n};\nconst noop = () => {};\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight; // eslint-disable-line no-unused-expressions\n};\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery;\n }\n return null;\n};\nconst DOMContentLoadedCallbacks = [];\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback();\n }\n });\n }\n DOMContentLoadedCallbacks.push(callback);\n } else {\n callback();\n }\n};\nconst isRTL = () => document.documentElement.dir === 'rtl';\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery();\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME;\n const JQUERY_NO_CONFLICT = $.fn[name];\n $.fn[name] = plugin.jQueryInterface;\n $.fn[name].Constructor = plugin;\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT;\n return plugin.jQueryInterface;\n };\n }\n });\n};\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;\n};\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback);\n return;\n }\n const durationPadding = 5;\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n let called = false;\n const handler = ({\n target\n }) => {\n if (target !== transitionElement) {\n return;\n }\n called = true;\n transitionElement.removeEventListener(TRANSITION_END, handler);\n execute(callback);\n };\n transitionElement.addEventListener(TRANSITION_END, handler);\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement);\n }\n }, emulatedDuration);\n};\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length;\n let index = list.indexOf(activeElement);\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n }\n index += shouldGetNext ? 1 : -1;\n if (isCycleAllowed) {\n index = (index + listLength) % listLength;\n }\n return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\nlet uidEvent = 1;\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n};\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\nfunction getElementEvents(element) {\n const uid = makeEventUid(element);\n element.uidEvent = uid;\n eventRegistry[uid] = eventRegistry[uid] || {};\n return eventRegistry[uid];\n}\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, {\n delegateTarget: element\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn);\n }\n return fn.apply(element, [event]);\n };\n}\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector);\n for (let {\n target\n } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue;\n }\n hydrateObj(event, {\n delegateTarget: target\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn);\n }\n return fn.apply(target, [event]);\n }\n }\n };\n}\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n}\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string';\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n let typeEvent = getTypeEvent(originalTypeEvent);\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent;\n }\n return [isDelegated, callable, typeEvent];\n}\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n return fn.call(this, event);\n }\n };\n };\n callable = wrapFunction(callable);\n }\n const events = getElementEvents(element);\n const handlers = events[typeEvent] || (events[typeEvent] = {});\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\n return;\n }\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n fn.delegationSelector = isDelegated ? handler : null;\n fn.callable = callable;\n fn.oneOff = oneOff;\n fn.uidEvent = uid;\n handlers[uid] = fn;\n element.addEventListener(typeEvent, fn, isDelegated);\n}\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\n if (!fn) {\n return;\n }\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n delete events[typeEvent][fn.uidEvent];\n}\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {};\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n}\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '');\n return customEvents[event] || event;\n}\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false);\n },\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true);\n },\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n const inNamespace = typeEvent !== originalTypeEvent;\n const events = getElementEvents(element);\n const storeElementEvent = events[typeEvent] || {};\n const isNamespace = originalTypeEvent.startsWith('.');\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return;\n }\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n return;\n }\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n }\n }\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n },\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null;\n }\n const $ = getjQuery();\n const typeEvent = getTypeEvent(event);\n const inNamespace = event !== typeEvent;\n let jQueryEvent = null;\n let bubbles = true;\n let nativeDispatch = true;\n let defaultPrevented = false;\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args);\n $(element).trigger(jQueryEvent);\n bubbles = !jQueryEvent.isPropagationStopped();\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n defaultPrevented = jQueryEvent.isDefaultPrevented();\n }\n const evt = hydrateObj(new Event(event, {\n bubbles,\n cancelable: true\n }), args);\n if (defaultPrevented) {\n evt.preventDefault();\n }\n if (nativeDispatch) {\n element.dispatchEvent(evt);\n }\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault();\n }\n return evt;\n }\n};\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value;\n } catch (_unused) {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value;\n }\n });\n }\n }\n return obj;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n if (value === Number(value).toString()) {\n return Number(value);\n }\n if (value === '' || value === 'null') {\n return null;\n }\n if (typeof value !== 'string') {\n return value;\n }\n try {\n return JSON.parse(decodeURIComponent(value));\n } catch (_unused) {\n return value;\n }\n}\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n },\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n },\n getDataAttributes(element) {\n if (!element) {\n return {};\n }\n const attributes = {};\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '');\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n attributes[pureKey] = normalizeData(element.dataset[key]);\n }\n return attributes;\n },\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {};\n }\n static get DefaultType() {\n return {};\n }\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!');\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n return config;\n }\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n };\n }\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property];\n const valueType = isElement(value) ? 'element' : toType(value);\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n }\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.3';\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super();\n element = getElement(element);\n if (!element) {\n return;\n }\n this._element = element;\n this._config = this._getConfig(config);\n Data.set(this._element, this.constructor.DATA_KEY, this);\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY);\n EventHandler.off(this._element, this.constructor.EVENT_KEY);\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null;\n }\n }\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated);\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY);\n }\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n }\n static get VERSION() {\n return VERSION;\n }\n static get DATA_KEY() {\n return `bs.${this.NAME}`;\n }\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`;\n }\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target');\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href');\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n return null;\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n }\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n }\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;\n};\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n },\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector);\n },\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector));\n },\n parents(element, selector) {\n const parents = [];\n let ancestor = element.parentNode.closest(selector);\n while (ancestor) {\n parents.push(ancestor);\n ancestor = ancestor.parentNode.closest(selector);\n }\n return parents;\n },\n prev(element, selector) {\n let previous = element.previousElementSibling;\n while (previous) {\n if (previous.matches(selector)) {\n return [previous];\n }\n previous = previous.previousElementSibling;\n }\n return [];\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling;\n while (next) {\n if (next.matches(selector)) {\n return [next];\n }\n next = next.nextElementSibling;\n }\n return [];\n },\n focusableChildren(element) {\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n },\n getSelectorFromElement(element) {\n const selector = getSelector(element);\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null;\n }\n return null;\n },\n getElementFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.findOne(selector) : null;\n },\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.find(selector) : [];\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n const name = component.NAME;\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n const instance = component.getOrCreateInstance(target);\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]();\n });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$f = 'alert';\nconst DATA_KEY$a = 'bs.alert';\nconst EVENT_KEY$b = `.${DATA_KEY$a}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$b}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$b}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$f;\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n if (closeEvent.defaultPrevented) {\n return;\n }\n this._element.classList.remove(CLASS_NAME_SHOW$8);\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n }\n\n // Private\n _destroyElement() {\n this._element.remove();\n EventHandler.trigger(this._element, EVENT_CLOSED);\n this.dispose();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close');\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$e = 'button';\nconst DATA_KEY$9 = 'bs.button';\nconst EVENT_KEY$a = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$e;\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this);\n if (config === 'toggle') {\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n event.preventDefault();\n const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n const data = Button.getOrCreateInstance(button);\n data.toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$d = 'swipe';\nconst EVENT_KEY$9 = '.bs.swipe';\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SWIPE_THRESHOLD = 40;\nconst Default$c = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n};\nconst DefaultType$c = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n};\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super();\n this._element = element;\n if (!element || !Swipe.isSupported()) {\n return;\n }\n this._config = this._getConfig(config);\n this._deltaX = 0;\n this._supportPointerEvents = Boolean(window.PointerEvent);\n this._initEvents();\n }\n\n // Getters\n static get Default() {\n return Default$c;\n }\n static get DefaultType() {\n return DefaultType$c;\n }\n static get NAME() {\n return NAME$d;\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY$9);\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX;\n return;\n }\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX;\n }\n }\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX;\n }\n this._handleSwipe();\n execute(this._config.endCallback);\n }\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n }\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX);\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return;\n }\n const direction = absDeltaX / this._deltaX;\n this._deltaX = 0;\n if (!direction) {\n return;\n }\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n }\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n }\n }\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$c = 'carousel';\nconst DATA_KEY$8 = 'bs.carousel';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst ARROW_LEFT_KEY$1 = 'ArrowLeft';\nconst ARROW_RIGHT_KEY$1 = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst EVENT_SLIDE = `slide${EVENT_KEY$8}`;\nconst EVENT_SLID = `slid${EVENT_KEY$8}`;\nconst EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\nconst EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\nconst EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\nconst EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n};\nconst Default$b = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n};\nconst DefaultType$b = {\n interval: '(number|boolean)',\n // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._interval = null;\n this._activeElement = null;\n this._isSliding = false;\n this.touchTimeout = null;\n this._swipeHelper = null;\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n this._addEventListeners();\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$b;\n }\n static get DefaultType() {\n return DefaultType$b;\n }\n static get NAME() {\n return NAME$c;\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT);\n }\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next();\n }\n }\n prev() {\n this._slide(ORDER_PREV);\n }\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element);\n }\n this._clearInterval();\n }\n cycle() {\n this._clearInterval();\n this._updateInterval();\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n }\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n return;\n }\n this.cycle();\n }\n to(index) {\n const items = this._getItems();\n if (index > items.length - 1 || index < 0) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n return;\n }\n const activeIndex = this._getItemIndex(this._getActive());\n if (activeIndex === index) {\n return;\n }\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n this._slide(order, items[index]);\n }\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose();\n }\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval;\n return config;\n }\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n }\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n }\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners();\n }\n }\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n }\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return;\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause();\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout);\n }\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n };\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n };\n this._swipeHelper = new Swipe(this._element, swipeConfig);\n }\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n const direction = KEY_TO_DIRECTION[event.key];\n if (direction) {\n event.preventDefault();\n this._slide(this._directionToOrder(direction));\n }\n }\n _getItemIndex(element) {\n return this._getItems().indexOf(element);\n }\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return;\n }\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n activeIndicator.removeAttribute('aria-current');\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n newActiveIndicator.setAttribute('aria-current', 'true');\n }\n }\n _updateInterval() {\n const element = this._activeElement || this._getActive();\n if (!element) {\n return;\n }\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n this._config.interval = elementInterval || this._config.defaultInterval;\n }\n _slide(order, element = null) {\n if (this._isSliding) {\n return;\n }\n const activeElement = this._getActive();\n const isNext = order === ORDER_NEXT;\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n if (nextElement === activeElement) {\n return;\n }\n const nextElementIndex = this._getItemIndex(nextElement);\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n });\n };\n const slideEvent = triggerEvent(EVENT_SLIDE);\n if (slideEvent.defaultPrevented) {\n return;\n }\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return;\n }\n const isCycling = Boolean(this._interval);\n this.pause();\n this._isSliding = true;\n this._setActiveIndicatorElement(nextElementIndex);\n this._activeElement = nextElement;\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n nextElement.classList.add(orderClassName);\n reflow(nextElement);\n activeElement.classList.add(directionalClassName);\n nextElement.classList.add(directionalClassName);\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName);\n nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n this._isSliding = false;\n triggerEvent(EVENT_SLID);\n };\n this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n if (isCycling) {\n this.cycle();\n }\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE);\n }\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n }\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element);\n }\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n }\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n }\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config);\n if (typeof config === 'number') {\n data.to(config);\n return;\n }\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return;\n }\n event.preventDefault();\n const carousel = Carousel.getOrCreateInstance(target);\n const slideIndex = this.getAttribute('data-bs-slide-to');\n if (slideIndex) {\n carousel.to(slideIndex);\n carousel._maybeEnableCycle();\n return;\n }\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next();\n carousel._maybeEnableCycle();\n return;\n }\n carousel.prev();\n carousel._maybeEnableCycle();\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel);\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$b = 'collapse';\nconst DATA_KEY$7 = 'bs.collapse';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\nconst EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\nconst EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\nconst EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\nconst Default$a = {\n parent: null,\n toggle: true\n};\nconst DefaultType$a = {\n parent: '(null|element)',\n toggle: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isTransitioning = false;\n this._triggerArray = [];\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem);\n const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem);\n }\n }\n this._initializeChildren();\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n }\n if (this._config.toggle) {\n this.toggle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$a;\n }\n static get DefaultType() {\n return DefaultType$a;\n }\n static get NAME() {\n return NAME$b;\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide();\n } else {\n this.show();\n }\n }\n show() {\n if (this._isTransitioning || this._isShown()) {\n return;\n }\n let activeChildren = [];\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n toggle: false\n }));\n }\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n for (const activeInstance of activeChildren) {\n activeInstance.hide();\n }\n const dimension = this._getDimension();\n this._element.classList.remove(CLASS_NAME_COLLAPSE);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.style[dimension] = 0;\n this._addAriaAndCollapsedClass(this._triggerArray, true);\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n this._element.style[dimension] = '';\n EventHandler.trigger(this._element, EVENT_SHOWN$6);\n };\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n const scrollSize = `scroll${capitalizedDimension}`;\n this._queueCallback(complete, this._element, true);\n this._element.style[dimension] = `${this._element[scrollSize]}px`;\n }\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n const dimension = this._getDimension();\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger);\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false);\n }\n }\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE);\n EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n };\n this._element.style[dimension] = '';\n this._queueCallback(complete, this._element, true);\n }\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW$7);\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle); // Coerce string values\n config.parent = getElement(config.parent);\n return config;\n }\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n }\n _initializeChildren() {\n if (!this._config.parent) {\n return;\n }\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element);\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected));\n }\n }\n }\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n }\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return;\n }\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n element.setAttribute('aria-expanded', isOpen);\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {};\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config);\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n event.preventDefault();\n }\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, {\n toggle: false\n }).toggle();\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$a = 'dropdown';\nconst DATA_KEY$6 = 'bs.dropdown';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY$1 = 'ArrowUp';\nconst ARROW_DOWN_KEY$1 = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center';\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR = '.navbar';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst PLACEMENT_TOPCENTER = 'top';\nconst PLACEMENT_BOTTOMCENTER = 'bottom';\nconst Default$9 = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n};\nconst DefaultType$9 = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n};\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._popper = null;\n this._parent = this._element.parentNode; // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n this._inNavbar = this._detectNavbar();\n }\n\n // Getters\n static get Default() {\n return Default$9;\n }\n static get DefaultType() {\n return DefaultType$9;\n }\n static get NAME() {\n return NAME$a;\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show();\n }\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n if (showEvent.defaultPrevented) {\n return;\n }\n this._createPopper();\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n this._element.focus();\n this._element.setAttribute('aria-expanded', true);\n this._menu.classList.add(CLASS_NAME_SHOW$6);\n this._element.classList.add(CLASS_NAME_SHOW$6);\n EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n }\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n this._completeHide(relatedTarget);\n }\n dispose() {\n if (this._popper) {\n this._popper.destroy();\n }\n super.dispose();\n }\n update() {\n this._inNavbar = this._detectNavbar();\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n if (this._popper) {\n this._popper.destroy();\n }\n this._menu.classList.remove(CLASS_NAME_SHOW$6);\n this._element.classList.remove(CLASS_NAME_SHOW$6);\n this._element.setAttribute('aria-expanded', 'false');\n Manipulator.removeDataAttribute(this._menu, 'popper');\n EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n }\n _getConfig(config) {\n config = super._getConfig(config);\n if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n }\n return config;\n }\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n }\n let referenceElement = this._element;\n if (this._config.reference === 'parent') {\n referenceElement = this._parent;\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference);\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference;\n }\n const popperConfig = this._getPopperConfig();\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n }\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n }\n _getPlacement() {\n const parentDropdown = this._parent;\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER;\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n }\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n }\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null;\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n };\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }];\n }\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _selectMenuItem({\n key,\n target\n }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n if (!items.length) {\n return;\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n return;\n }\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle);\n if (!context || context._config.autoClose === false) {\n continue;\n }\n const composedPath = event.composedPath();\n const isMenuTarget = composedPath.includes(context._menu);\n if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n continue;\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue;\n }\n const relatedTarget = {\n relatedTarget: context._element\n };\n if (event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n context._completeHide(relatedTarget);\n }\n }\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName);\n const isEscapeEvent = event.key === ESCAPE_KEY$2;\n const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return;\n }\n if (isInput && !isEscapeEvent) {\n return;\n }\n event.preventDefault();\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n const instance = Dropdown.getOrCreateInstance(getToggleButton);\n if (isUpOrDownEvent) {\n event.stopPropagation();\n instance.show();\n instance._selectMenuItem(event);\n return;\n }\n if (instance._isShown()) {\n // else is escape and we check if it is shown\n event.stopPropagation();\n instance.hide();\n getToggleButton.focus();\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n event.preventDefault();\n Dropdown.getOrCreateInstance(this).toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$9 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\nconst Default$8 = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true,\n // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n};\nconst DefaultType$8 = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n};\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isAppended = false;\n this._element = null;\n }\n\n // Getters\n static get Default() {\n return Default$8;\n }\n static get DefaultType() {\n return DefaultType$8;\n }\n static get NAME() {\n return NAME$9;\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._append();\n const element = this._getElement();\n if (this._config.isAnimated) {\n reflow(element);\n }\n element.classList.add(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n execute(callback);\n });\n }\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n this.dispose();\n execute(callback);\n });\n }\n dispose() {\n if (!this._isAppended) {\n return;\n }\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\n this._element.remove();\n this._isAppended = false;\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div');\n backdrop.className = this._config.className;\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE$4);\n }\n this._element = backdrop;\n }\n return this._element;\n }\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement);\n return config;\n }\n _append() {\n if (this._isAppended) {\n return;\n }\n const element = this._getElement();\n this._config.rootElement.append(element);\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback);\n });\n this._isAppended = true;\n }\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$8 = 'focustrap';\nconst DATA_KEY$5 = 'bs.focustrap';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\nconst Default$7 = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n};\nconst DefaultType$7 = {\n autofocus: 'boolean',\n trapElement: 'element'\n};\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isActive = false;\n this._lastTabNavDirection = null;\n }\n\n // Getters\n static get Default() {\n return Default$7;\n }\n static get DefaultType() {\n return DefaultType$7;\n }\n static get NAME() {\n return NAME$8;\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return;\n }\n if (this._config.autofocus) {\n this._config.trapElement.focus();\n }\n EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n this._isActive = true;\n }\n deactivate() {\n if (!this._isActive) {\n return;\n }\n this._isActive = false;\n EventHandler.off(document, EVENT_KEY$5);\n }\n\n // Private\n _handleFocusin(event) {\n const {\n trapElement\n } = this._config;\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return;\n }\n const elements = SelectorEngine.focusableChildren(trapElement);\n if (elements.length === 0) {\n trapElement.focus();\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus();\n } else {\n elements[0].focus();\n }\n }\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return;\n }\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\nconst PROPERTY_PADDING = 'padding-right';\nconst PROPERTY_MARGIN = 'margin-right';\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body;\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth;\n return Math.abs(window.innerWidth - documentWidth);\n }\n hide() {\n const width = this.getWidth();\n this._disableOverFlow();\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n }\n reset() {\n this._resetElementAttributes(this._element, 'overflow');\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n }\n isOverflowing() {\n return this.getWidth() > 0;\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow');\n this._element.style.overflow = 'hidden';\n }\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth();\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return;\n }\n this._saveInitialAttribute(element, styleProperty);\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty);\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\n }\n }\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty);\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty);\n return;\n }\n Manipulator.removeDataAttribute(element, styleProperty);\n element.style.setProperty(styleProperty, value);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector);\n return;\n }\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel);\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$7 = 'modal';\nconst DATA_KEY$4 = 'bs.modal';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\nconst EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\nconst EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst OPEN_SELECTOR$1 = '.modal.show';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\nconst Default$6 = {\n backdrop: true,\n focus: true,\n keyboard: true\n};\nconst DefaultType$6 = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._isShown = false;\n this._isTransitioning = false;\n this._scrollBar = new ScrollBarHelper();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$6;\n }\n static get DefaultType() {\n return DefaultType$6;\n }\n static get NAME() {\n return NAME$7;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._isTransitioning = true;\n this._scrollBar.hide();\n document.body.classList.add(CLASS_NAME_OPEN);\n this._adjustDialog();\n this._backdrop.show(() => this._showElement(relatedTarget));\n }\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._isShown = false;\n this._isTransitioning = true;\n this._focustrap.deactivate();\n this._element.classList.remove(CLASS_NAME_SHOW$4);\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n }\n dispose() {\n EventHandler.off(window, EVENT_KEY$4);\n EventHandler.off(this._dialog, EVENT_KEY$4);\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n handleUpdate() {\n this._adjustDialog();\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop),\n // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element);\n }\n this._element.style.display = 'block';\n this._element.removeAttribute('aria-hidden');\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.scrollTop = 0;\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n if (modalBody) {\n modalBody.scrollTop = 0;\n }\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_SHOW$4);\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate();\n }\n this._isTransitioning = false;\n EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n relatedTarget\n });\n };\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n if (event.key !== ESCAPE_KEY$1) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n this._triggerBackdropTransition();\n });\n EventHandler.on(window, EVENT_RESIZE$1, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog();\n }\n });\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return;\n }\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition();\n return;\n }\n if (this._config.backdrop) {\n this.hide();\n }\n });\n });\n }\n _hideModal() {\n this._element.style.display = 'none';\n this._element.setAttribute('aria-hidden', true);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n this._isTransitioning = false;\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN);\n this._resetAdjustments();\n this._scrollBar.reset();\n EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n });\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE$3);\n }\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n if (hideEvent.defaultPrevented) {\n return;\n }\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const initialOverflowY = this._element.style.overflowY;\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return;\n }\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n this._element.classList.add(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY;\n }, this._dialog);\n }, this._dialog);\n this._element.focus();\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const scrollbarWidth = this._scrollBar.getWidth();\n const isBodyOverflowing = scrollbarWidth > 0;\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n }\n _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](relatedTarget);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$4, () => {\n if (isVisible(this)) {\n this.focus();\n }\n });\n });\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide();\n }\n const data = Modal.getOrCreateInstance(target);\n data.toggle(this);\n});\nenableDismissTrigger(Modal);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$6 = 'offcanvas';\nconst DATA_KEY$3 = 'bs.offcanvas';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst ESCAPE_KEY = 'Escape';\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_SHOWING$1 = 'showing';\nconst CLASS_NAME_HIDING = 'hiding';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$3}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\nconst Default$5 = {\n backdrop: true,\n keyboard: true,\n scroll: false\n};\nconst DefaultType$5 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isShown = false;\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$5;\n }\n static get DefaultType() {\n return DefaultType$5;\n }\n static get NAME() {\n return NAME$6;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._backdrop.show();\n if (!this._config.scroll) {\n new ScrollBarHelper().hide();\n }\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.classList.add(CLASS_NAME_SHOWING$1);\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate();\n }\n this._element.classList.add(CLASS_NAME_SHOW$3);\n this._element.classList.remove(CLASS_NAME_SHOWING$1);\n EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n relatedTarget\n });\n };\n this._queueCallback(completeCallBack, this._element, true);\n }\n hide() {\n if (!this._isShown) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._focustrap.deactivate();\n this._element.blur();\n this._isShown = false;\n this._element.classList.add(CLASS_NAME_HIDING);\n this._backdrop.hide();\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n if (!this._config.scroll) {\n new ScrollBarHelper().reset();\n }\n EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n };\n this._queueCallback(completeCallback, this._element, true);\n }\n dispose() {\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n this.hide();\n };\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop);\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n });\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$3, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus();\n }\n });\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide();\n }\n const data = Offcanvas.getOrCreateInstance(target);\n data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show();\n }\n});\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide();\n }\n }\n});\nenableDismissTrigger(Offcanvas);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\nconst DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n};\n// js-docs-end allow-list\n\nconst uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase();\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n }\n return true;\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml;\n }\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml);\n }\n const domParser = new window.DOMParser();\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase();\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove();\n continue;\n }\n const attributeList = [].concat(...element.attributes);\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName);\n }\n }\n }\n return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$5 = 'TemplateFactory';\nconst Default$4 = {\n allowList: DefaultAllowlist,\n content: {},\n // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
    '\n};\nconst DefaultType$4 = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n};\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n};\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n }\n\n // Getters\n static get Default() {\n return Default$4;\n }\n static get DefaultType() {\n return DefaultType$4;\n }\n static get NAME() {\n return NAME$5;\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n }\n hasContent() {\n return this.getContent().length > 0;\n }\n changeContent(content) {\n this._checkContent(content);\n this._config.content = {\n ...this._config.content,\n ...content\n };\n return this;\n }\n toHtml() {\n const templateWrapper = document.createElement('div');\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector);\n }\n const template = templateWrapper.children[0];\n const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n if (extraClass) {\n template.classList.add(...extraClass.split(' '));\n }\n return template;\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config);\n this._checkContent(config.content);\n }\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({\n selector,\n entry: content\n }, DefaultContentType);\n }\n }\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template);\n if (!templateElement) {\n return;\n }\n content = this._resolvePossibleFunction(content);\n if (!content) {\n templateElement.remove();\n return;\n }\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement);\n return;\n }\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content);\n return;\n }\n templateElement.textContent = content;\n }\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this]);\n }\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = '';\n templateElement.append(element);\n return;\n }\n templateElement.textContent = element.textContent;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$4 = 'tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\nconst EVENT_HIDE$2 = 'hide';\nconst EVENT_HIDDEN$2 = 'hidden';\nconst EVENT_SHOW$2 = 'show';\nconst EVENT_SHOWN$2 = 'shown';\nconst EVENT_INSERTED = 'inserted';\nconst EVENT_CLICK$1 = 'click';\nconst EVENT_FOCUSIN$1 = 'focusin';\nconst EVENT_FOCUSOUT$1 = 'focusout';\nconst EVENT_MOUSEENTER = 'mouseenter';\nconst EVENT_MOUSELEAVE = 'mouseleave';\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
    ' + '
    ' + '
    ' + '
    ',\n title: '',\n trigger: 'hover focus'\n};\nconst DefaultType$3 = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n};\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n }\n super(element, config);\n\n // Private\n this._isEnabled = true;\n this._timeout = 0;\n this._isHovered = null;\n this._activeTrigger = {};\n this._popper = null;\n this._templateFactory = null;\n this._newContent = null;\n\n // Protected\n this.tip = null;\n this._setListeners();\n if (!this._config.selector) {\n this._fixTitle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$3;\n }\n static get DefaultType() {\n return DefaultType$3;\n }\n static get NAME() {\n return NAME$4;\n }\n\n // Public\n enable() {\n this._isEnabled = true;\n }\n disable() {\n this._isEnabled = false;\n }\n toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n }\n toggle() {\n if (!this._isEnabled) {\n return;\n }\n this._activeTrigger.click = !this._activeTrigger.click;\n if (this._isShown()) {\n this._leave();\n return;\n }\n this._enter();\n }\n dispose() {\n clearTimeout(this._timeout);\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n }\n this._disposePopper();\n super.dispose();\n }\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements');\n }\n if (!(this._isWithContent() && this._isEnabled)) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n const shadowRoot = findShadowRoot(this._element);\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n if (showEvent.defaultPrevented || !isInTheDom) {\n return;\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper();\n const tip = this._getTipElement();\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n const {\n container\n } = this._config;\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip);\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n }\n this._popper = this._createPopper(tip);\n tip.classList.add(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n if (this._isHovered === false) {\n this._leave();\n }\n this._isHovered = false;\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n hide() {\n if (!this._isShown()) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n if (hideEvent.defaultPrevented) {\n return;\n }\n const tip = this._getTipElement();\n tip.classList.remove(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n this._activeTrigger[TRIGGER_CLICK] = false;\n this._activeTrigger[TRIGGER_FOCUS] = false;\n this._activeTrigger[TRIGGER_HOVER] = false;\n this._isHovered = null; // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return;\n }\n if (!this._isHovered) {\n this._disposePopper();\n }\n this._element.removeAttribute('aria-describedby');\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n update() {\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle());\n }\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n }\n return this.tip;\n }\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml();\n\n // TODO: remove this check in v6\n if (!tip) {\n return null;\n }\n tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n const tipId = getUID(this.constructor.NAME).toString();\n tip.setAttribute('id', tipId);\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE$2);\n }\n return tip;\n }\n setContent(content) {\n this._newContent = content;\n if (this._isShown()) {\n this._disposePopper();\n this.show();\n }\n }\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content);\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n });\n }\n return this._templateFactory;\n }\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n };\n }\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n }\n _isAnimated() {\n return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n }\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n }\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element]);\n const attachment = AttachmentMap[placement.toUpperCase()];\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element]);\n }\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [{\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }, {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n }, {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n }\n }]\n };\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _setListeners() {\n const triggers = this._config.trigger.split(' ');\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context.toggle();\n });\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n context._enter();\n });\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n context._leave();\n });\n }\n }\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide();\n }\n };\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n }\n _fixTitle() {\n const title = this._element.getAttribute('title');\n if (!title) {\n return;\n }\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title);\n }\n this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title');\n }\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true;\n return;\n }\n this._isHovered = true;\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show();\n }\n }, this._config.delay.show);\n }\n _leave() {\n if (this._isWithActiveTrigger()) {\n return;\n }\n this._isHovered = false;\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide();\n }\n }, this._config.delay.hide);\n }\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout);\n this._timeout = setTimeout(handler, timeout);\n }\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true);\n }\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element);\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute];\n }\n }\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n };\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container);\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n return config;\n }\n _getDelegateConfig() {\n const config = {};\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value;\n }\n }\n config.selector = false;\n config.trigger = 'manual';\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config;\n }\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n if (this.tip) {\n this.tip.remove();\n this.tip = null;\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$3 = 'popover';\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\nconst Default$2 = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
    ' + '
    ' + '

    ' + '
    ' + '
    ',\n trigger: 'click'\n};\nconst DefaultType$2 = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n};\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default$2;\n }\n static get DefaultType() {\n return DefaultType$2;\n }\n static get NAME() {\n return NAME$3;\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent();\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n };\n }\n _getContent() {\n return this._resolvePossibleFunction(this._config.content);\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_CLICK = `click${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_TARGET_LINKS = '[href]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst Default$1 = {\n offset: null,\n // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n};\nconst DefaultType$1 = {\n offset: '(number|null)',\n // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n};\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map();\n this._observableSections = new Map();\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n this._activeTarget = null;\n this._observer = null;\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n };\n this.refresh(); // initialize\n }\n\n // Getters\n static get Default() {\n return Default$1;\n }\n static get DefaultType() {\n return DefaultType$1;\n }\n static get NAME() {\n return NAME$2;\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables();\n this._maybeEnableSmoothScroll();\n if (this._observer) {\n this._observer.disconnect();\n } else {\n this._observer = this._getNewObserver();\n }\n for (const section of this._observableSections.values()) {\n this._observer.observe(section);\n }\n }\n dispose() {\n this._observer.disconnect();\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body;\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n }\n return config;\n }\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return;\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK);\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash);\n if (observableSection) {\n event.preventDefault();\n const root = this._rootElement || window;\n const height = observableSection.offsetTop - this._element.offsetTop;\n if (root.scrollTo) {\n root.scrollTo({\n top: height,\n behavior: 'smooth'\n });\n return;\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height;\n }\n });\n }\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n };\n return new IntersectionObserver(entries => this._observerCallback(entries), options);\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n this._process(targetElement(entry));\n };\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n this._previousScrollData.parentScrollTop = parentScrollTop;\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null;\n this._clearActiveClass(targetElement(entry));\n continue;\n }\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry);\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return;\n }\n continue;\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry);\n }\n }\n }\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map();\n this._observableSections = new Map();\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue;\n }\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor);\n this._observableSections.set(anchor.hash, observableSection);\n }\n }\n }\n _process(target) {\n if (this._activeTarget === target) {\n return;\n }\n this._clearActiveClass(this._config.target);\n this._activeTarget = target;\n target.classList.add(CLASS_NAME_ACTIVE$1);\n this._activateParents(target);\n EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n relatedTarget: target\n });\n }\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n return;\n }\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both